2016-05-09 14 views
8

Periodisch in meiner App muss ich große Schreibvorgänge in Realm, irgendwo zwischen 100 bis 10.000 Objekte durchführen. 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.Realm Write durchgeführt auf Hintergrund Thread noch Blöcke Main UI

+0

Können Sie teilen, was der Hauptthread macht, wenn er blockiert? Ein Stack-Trace während der Blockierung wäre besonders interessant. – bdash

+0

Wie im Stack-Trace von System Trace oder Time Profiler in Instruments @bdash? – Amloelxer

+0

Ja, Time Profiler sollte zeigen, was der Haupt-Thread gerade macht. Auch wenn der Debugger beim Blockieren des Hauptthreads unterbrochen wird und der Stack-Trace des Hauptthreads angezeigt wird, kann dies ausreichen, um zu sehen, wo der Hauptthread blockiert ist. – bdash

Antwort

5

Der von Ihnen bereitgestellte Code ist der korrekte Weg, um einen asynchronen Hintergrund mit Realm zu schreiben. Es sollte den Hauptthread nur blockieren, wenn der Hauptthread selbst versucht, eine Schreibtransaktion auszuführen, während der Hintergrund geschrieben wird.

Der von Ihnen gemeinsam genutzte Trace zeigt an, dass der Großteil der Nicht-Leerlaufzeit für den Hauptthread für die Verarbeitung von Web Socket-Nachrichten aufgewendet wird. Es gibt keine Hinweise darauf, dass Arbeiten im Zusammenhang mit Realms im Hauptthread auftreten. Die Verarbeitung der Web-Socket-Nachricht 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 verwendet, die sich auf NSDateFormatter beziehen. Insbesondere scheint der NSDateFormatter häufig seine zugrundeliegende CFDateFormatter zu regenerieren. Dies deutet darauf hin, dass die Eigenschaften von NSDateFormatter häufig aktualisiert werden oder dass neue NSDateFormatter Instanzen für jeden Anruf verwendet werden. Diese beiden Praktiken sollten vermieden werden.

+0

Vielen Dank bdash! Das war die Lösung. Schätze die Hilfe – Amloelxer

Verwandte Themen