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
Antwort
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.
Vielen Dank bdash! Das war die Lösung. Schätze die Hilfe – Amloelxer
- 1. Mit async/warten noch auf UI-Blöcke auf Xamarin.Android
- 2. Qt: Hintergrund Thread Aktualisierung UI-Thread
- 3. NSOperation Blöcke UI Malerei?
- 4. Main Thread wartet auf Hintergrund Threads, die die Schnittstelle aktualisieren
- 5. Taskfortsetzung auf UI-Thread, wenn vom Hintergrund Thread gestartet
- 6. drawViewHierarchyInRect auf Hintergrund thread
- 7. Realm - Realm Zugriff von falschem Thread Swift
- 8. Ausnahme im Thread "main" java.lang.RuntimeException: Noch nicht implementiert
- 9. Process Observable auf Hintergrund Thread
- 10. Arbeiter/Hintergrund Thread "erstickt" UI-Thread Android- Warum?
- 11. Daten auf einem Hintergrund Realm geschrieben ist nicht verfügbar, sofort zur Haupt Realm
- 12. Ausnahme im Thread "main"
- 13. Eine Ansicht auf einen Hintergrund Thread laden
- 14. Ausnahme im Thread "Thread-340" Android + Realm
- 15. Haupt-Thread sieht keine Änderungen von Hintergrund Thread gemacht
- 16. C# Hintergrund-UI-Update
- 17. Thread-Blöcke während des Anrufs
- 18. Taskfortsetzung auf dem UI-Thread
- 19. WP7 - Zugriff auf UI-Thread?
- 20. Ausnahme im Thread "main" java.lang.ClassNotFoundException:
- 21. Exception in thread "main" scala.ScalaReflectionException
- 22. Starten paralleler Thread von Main und warten auf Ergebnis
- 23. Realm von falschem Thread zugegriffen
- 24. Blackberry Hintergrund Hörer Thread
- 25. Die posix C write() und Thread-Sicherheit
- 26. ein Formular erstellen und Form.ShowDialog auf einem Hintergrund-Thread
- 27. Wie api auf Hintergrund Thread in Roboelectric in Android
- 28. Taskfortsetzung blockiert UI-Thread
- 29. ios schreiben auf Hintergrund-Thread auf die Festplatte
- 30. Python: läuft Thread noch
Können Sie teilen, was der Hauptthread macht, wenn er blockiert? Ein Stack-Trace während der Blockierung wäre besonders interessant. – bdash
Wie im Stack-Trace von System Trace oder Time Profiler in Instruments @bdash? – Amloelxer
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