2017-12-31 8 views
0

Reich-DotnetGibt es eine Möglichkeit, eine Haupt-Thread-Realm-Instanz abzufragen, ohne den Haupt-Thread zu blockieren?

Ich möchte einige Hauptthread-Bereich zu einigen Ansicht Modelle Objekte passieren, aber nicht wollen, die Benutzeroberfläche blockieren, während ich sie abrufen.

Ich brauche Realm-Objekte aus einer Main-Thread-Realm-Instanz, so dass myRealmObject.PropertyChanged im Haupt-Thread aufgerufen wird. Wenn es keine Hintergrundabfrage gibt, gibt es eine Möglichkeit, das PropertyChanged eines Hintergrundthread-Realmobjekts im Hauptthread aufzurufen?

Antwort

1

Sie können einen Hintergrundthread abfragen und eine ThreadSafeReference erstellen, die Sie an Ihre VMs weitergeben können. Zum Beispiel:

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 

Dann in Ihrem Ansichtsmodell können Sie

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 
} 

prüfen haben aus the docs der näheren Erläuterung.

+0

Danke für die schnelle Antwort! Performance-weise, nennt ResolveReference eine große Anzahl von Referenzen (messbar) schneller als nur einen Haupt-Thread-Bereich für sie einmal abzufragen? – dave234

+1

Hängt von Ihrem Abfragetyp ab - wenn Sie nur ein Objekt nach PK suchen, dann nein. Wenn Sie eine komplexe Suche durchführen, die einen Tabellenscan (z. B. Suche nach Zeichenfolge enthält oder etwas Ähnliches) beinhaltet, dann ja. Grob gesagt hat 'ResolveReference' eine ähnliche Performance wie eine PK-Suche, hat aber den Vorteil, dass es auch für Objekte verfügbar ist, die keinen Primärschlüssel haben. –

Verwandte Themen