2017-12-31 6 views
0

영역-DOTNET메인 스레드를 차단하지 않고 메인 스레드 영역 인스턴스를 쿼리하는 방법이 있습니까?

좀 주 스레드 영역 일부 뷰 모델 객체를 전달하고 싶습니다,하지만 난 그들을 검색하는 동안 UI를 차단하고 싶지 않아요.

메인 스레드 영역에서 myRealmObject.PropertyChanged가 호출되도록 메인 스레드 영역 인스턴스의 영역 객체가 필요합니다. 배경 쿼리가 없다면 백그라운드 스레드 영역 객체의 PropertyChanged를 메인 스레드에서 호출하도록하는 방법이 있습니까?

답변

1

백그라운드 스레드에서 쿼리하고 VM에 전달할 수있는 ThreadSafeReference을 만들 수 있습니다. 예를 들어 :

var reference = await Task.Run(() => 
{ 
    using (var realm = Realm.GetInstance()) 
    { 
     var modelToPass = realm.All<MyModel>().Where(...).FirstOrDefault(); 
     return ThreadSafeReference.Create(modelToPass); 
    } 
}); 
// Pass reference to your ViewModel 

는 그런 다음 뷰 모델에 좀 더 자세한 설명 the docs

public void Initialize(ThreadSafeReference.Object<MyModel> reference) 
{ 
    var realm = Realm.GetInstance(); 
    var myModel = realm.ResolveReference(reference); 
    // Do stuff with myModel - it's a main thread reference to 
    // the model you resolved on the background thread 
} 

체크 아웃 할 수 있습니다.

+0

신속한 답변을 보내 주셔서 감사합니다. 성능이 현명하다면, 레졸루션 레퍼런스 (ResolveReference)를 한 번 메인 스레드 영역을 쿼리하는 것보다 훨씬 많은 수의 레퍼런스 (측정 가능한)에서 더 빨리 호출하고 있는가? – dave234

+1

조회 유형에 따라 다릅니다. PK로 오브젝트를 찾는 경우, 아니오입니다. 복잡한 조회를 수행하는 경우 테이블 스캔 (예 : 문자열 포함 또는 유사한 검색), 예 (예 : 대략적으로 말하면,'ResolveReference'는 PK 룩업과 비슷한 성능을 가지고 있지만, 프라이 머리 키를 가지고 있지 않은 객체에 대해서조차도 이용할 수있는 이점이 있습니다. –

관련 문제