Der Realm-Schreibvorgang, der für den Hintergrund-Thread durchgeführt wurde, blockiert die Hauptbenutzeroberfläche

8

In meiner App muss ich regelmäßig große Schreibvorgänge in Realm durchführen, irgendwo zwischen 100 und 10.000 Objekten. Offensichtlich ist dies ein großer Schreibvorgang, also versuche ich diesen Schreibvorgang im Hintergrund auszuführen, damit der Benutzer andere Operationen ausführen kann und nicht einmal den Schreibvorgang bemerkt. Leider, obwohl ich dachte, dass mein Schreiben in einem Hintergrundthread ausgeführt wird, wird die Hauptoberfläche immer noch blockiert. Hier ist der Jist der Methode, die ich anrufe, um die Schreibvorgänge in Realm durchzuführen. Diese Methode wird wiederholt für einzelne Objekte aus einem Array aufgerufen, das durchgeschleift wird. Sieht es so aus, als würde ich irgendetwas eklatant falsch machen? Jede Hilfe würde sehr geschätzt werden.

%Vor%     
Amloelxer 09.05.2016, 19:29
quelle

1 Antwort

5

Ihr bereitgestellter Code ist der korrekte Weg, um einen asynchronen Hintergrund-Schreibvorgang mit Realm durchzuführen. Es sollte den Hauptthread nur blockieren, wenn der Hauptthread selbst versucht, eine Schreibtransaktion auszuführen, während der Hintergrund geschrieben wird.

Die von Ihnen gemeinsam genutzte Trace-Nachricht zeigt an, dass der Großteil der für den Haupt-Thread ausgegebenen Nicht-Leerlaufzeit für die Verarbeitung von Web-Socket-Nachrichten aufgewendet wird. Es gibt keine Hinweise darauf, dass Arbeiten im Zusammenhang mit Realm im Hauptthread auftreten. Die Web-Socket-Nachrichtenverarbeitung im Hauptthread macht 45% des gesamten Zeitraums der Ablaufverfolgung aus und ist wahrscheinlich der Grund für die blockierte Benutzeroberfläche, die bei Ihnen aufgetreten ist. Der Großteil der Web-Socket-Verarbeitungszeit wird für die Ausführung von Arbeiten in Verbindung mit NSDateFormatter verwendet. Insbesondere scheint NSDateFormatter häufig die zugrunde liegende CFDateFormatter neu zu generieren. Dies deutet darauf hin, dass Eigenschaften von NSDateFormatter häufig aktualisiert werden oder dass neue NSDateFormatter Instanzen für jeden Aufruf verwendet werden. Diese beiden Praktiken sollten vermieden werden.

    
bdash 10.05.2016, 17:19
quelle