NSFetchedResultsController: Fetch in einem Hintergrund-Thread

7

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:

%Vor%     
burki 10.02.2013, 22:14
quelle

3 Antworten

2

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.

    
ChrisH 11.02.2013, 15:05
quelle
16

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:

%Vor%

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.

    
quellish 29.07.2014 06:50
quelle
0

Sie können diesen sehr schönen Beitrag durchgehen auf Core Data mit Multi-Threading-Verhalten.

Hoffe es hilft .. !!

    
Suny 15.11.2013 14:35
quelle