2016-07-02 18 views
0

Gibt es einen Unterschied zwischen dem Auslösen einer CoreData (CRUD) -Operation mit einem privaten Kontext unter Verwendung performBlock und Auslösen einer solchen Operation mit dem Hauptkontext in einer Dispatch_async Hintergrundwarteschlange?CoreData und NSManagedObject Kontext - private vs. main

Ist es einfach so, dass man den Hauptkontext nicht in einem Hintergrundthread verwenden soll?

Link zu Apple Docs ist here.

Antwort

3

Sie sollten nie Verwenden Sie einen Hauptwarteschlangenkontext in einem Hintergrundthread. Das verstößt gegen die Thread-Confinement-Regeln.

Auf einen Hauptwarteschlangenkontext sollte nur von der Hauptwarteschlange (UI-Warteschlange/Thread) oder von einer performBlock zugegriffen werden. Wenn Sie eine nicht UI-bezogene Aufgabe ausführen müssen, sollten Sie einen privaten Warteschlangenkontext erstellen und über eine performBlock darauf zugreifen.

Um zu bestätigen, dass Ihr Kerndaten-Threading korrekt ist, können Sie die Laufzeiteinstellung -com.apple.CoreData.ConcurrencyDebug 1 aktivieren.

+0

Ich bekomme das. Aber ich habe die beiden Optionen getestet und beide scheinen zu funktionieren. Also meine Frage ist, ob das nur Glück ist, dass der verbotene Ansatz funktioniert ... – goggelj

+0

Es ist ein Threading-Verstoß, was bedeutet, dass es * meistens * der Zeit funktioniert und dann in der Produktion mit einem hohen Risiko der Datenbeschädigung versagt. Aus diesem Grund existiert die Debug-Einstellung. weil Threading-Bugs sich nicht konsistent darstellen. –

Verwandte Themen