Ich habe eine mehr oder weniger grundlegende UITableViewController
mit einem NSFetchedResultsController
. Der UITableViewController
wird auf den navigationController's
Stack geschoben. Die Push-Animation ist jedoch nicht reibungslos, da der Abruf von NSFetchedResultsController
im Hauptthread ausgeführt wird und daher die Benutzeroberfläche blockiert.
Meine Frage ist: Wie kann ich den NSFetchedResultsController
in einem Hintergrund-Thread holen, um die Animation flüssig zu halten?
Die NSFetchedResultsController
und die Delegate-Methoden sehen folgendermaßen aus:
Die allgemeine Regel mit Core Data ist ein Managed Object Context pro Thread und ein Thread pro MOC. In diesem Fall müssen Sie den Abruf für den Fetched Results Controller im Hauptthread durchführen, da dies der Thread ist, der mit den verwalteten Objekten des FRC interagiert. (Siehe Core Data Programming Guide - Parallelität mit Core Daten )
Wenn bei der Animation Leistungsprobleme auftreten, sollten Sie wahrscheinlich prüfen, ob der Abruf vor oder nach dem Verschieben der Ansicht ausgeführt wird. Normalerweise würden Sie den Abruf im viewDidLoad:
des Ansichtscontrollers durchführen, und der Navigationscontroller würde die Ansicht erst nach Abschluss des Abrufs übertragen.
TL; DR; Es gibt keinen guten Grund, einen Kontext in der Hauptwarteschlange zu verwenden.
kann NSFetchedResultsController zum Abrufen von Daten im Hintergrund verwenden
Absolut. NSFetchedResultsController
kann mit einem privaten Warteschlangenkontext verwendet werden. Es ist in der Tat ziemlich glücklich und leistungsfähig dabei. Es gibt einen Fehler , der verhindert, dass NSFetchedResultsController
den Cache verwendet, wenn er eine private Warteschlange verwendet, aber der Cache Gewinnen Sie nicht so viel wie in iOS 3.0. Setze ein cacheName
von nil und es wird dir gut gehen.
1.
Erstellen Sie einen Kontext mit NSPrivateQueueConcurrencyType
. Vorzugsweise nicht die, die Sie für IO verwenden.
2.
Erstellt den abgerufenen Ergebniscontroller mit diesem Kontext und einen Cache-Namen von null.
3.
Führen Sie den ersten Abruf aus einem performBlock:
-Block aus:
4.
Alle Ihre Delegierten-Callbacks werden jetzt aus der Warteschlange des Kontextes ausgeführt. Wenn Sie sie verwenden, um Ansichten zu aktualisieren, tun Sie dies, indem Sie wie oben beschrieben in die Hauptwarteschlange versenden.
5.
...
6.
Gewinn!
Sie können mehr über hier lesen.
Sie können diesen sehr schönen Beitrag durchgehen auf Core Data mit Multi-Threading-Verhalten.
Hoffe es hilft .. !!
Tags und Links multithreading ios core-data uiviewcontroller nsfetchedresultscontroller