Fetching Core Data im Hintergrund
-
20-09-2019 - |
Frage
Ich habe eine Navigationsansicht mit einer Tabellenansicht, wenn eine Zeile geklickt wird, wird die Zeile indexPath in der nächsten Ansicht übergeben.
in der Detailansicht viewDidLoad, ich bin Daten von Core Data abgerufen werden. Ich benutze das Abrufen aus der Anwendung delegiert
[appDelegate loadItem:i];
Wie Sie sehen, ich bin vorbei eine ganze Zahl nur die die Zeilennummer trägt.
Die Frage ist: Wie kann ich in einem anderen Thread mache diesen Aufruf Prozess. (Im Hintergrund) Ich brauche das, weil manchmal das Ergebnis des Abrufs zu groß ist, so dass die Verarbeitung 3 Sekunden dauert die Details anzeigen Verzögerung drücken.
Ich brauche für die drei Sekunden, um eine Aktivitätsanzeige angezeigt werden, so dass ich in einem anderen Thread die Fetch setzen muß in der Lage sein die Benutzeroberfläche für die Anzeige zu verwenden, während die Abruf- verarbeitet wird.
Ich mag die einfachste Art und Weise, wie ich ein Neuling bin. einige Codes der Veröffentlichung wird groß sein. oder Verbindungen:)
Lösung
Misch Multithreading und Core Data ist keine einfache Aufgabe. Die „Multi-Threading mit Core Data“ Abschnitt des Kerndaten Programmierhandbuch beschreibt, wie mit Core Data auf mehreren Threads kommunizieren, sich all die Dinge, einschließlich, dass Sie vorsichtig sein müssen.
Im Grunde müssen Sie für jeden Thread einen separaten verwaltete Objektkontext erstellen. Diese Kontexte können den Zugriff auf ein verwaltetes Objekt-Modell und persistenten Speicher teilen. Für Ihren Fall vorschlagen, dass sie die folgende:
Sie zwei verwaltete Objekt Kontexten mit einem einzelnen zugeordneten persistent Speicher-Koordinator. Sie holen in einem verwaltete Objektkontext auf einem Hintergrund fädeln, und übergibt den Objekt-IDs der geholten Objekte zu einem anderen Thread. Im das zweite Gewinde (typischerweise die Anwendung der Haupt-Thread, so dass Sie können dann die Ergebnisse) angezeigt werden, die Sie verwenden der zweite Kontext, in Objekte zu bemängeln mit dem Objekt-IDs (Sie verwenden objectWithID: die instanziiert Objekt).
Es klingt wie die BackgroundFetching Beispielanwendung zeigt, wie dies zu tun, aber ich weiß es nicht auf meinem System hat.
Bevor Sie jedoch zu weit kommen in Ihrer Anfrage holen Multithreading, würde ich einen harten Blick in nehmen, warum es so lange Last nehmen. Ich würde zunächst empfehlen -setFetchBatchSize mit: auf NSFetchRequest die Anzahl der Objekte in den Speicher über Ihre holen geladen zu begrenzen (die Sie viel Speicher sparen, auch). Als nächstes würde ich -setPropertiesToFetch benutzen. Um die Eigenschaften zu begrenzen geholt nur diejenigen, die Sie sofort verwenden werden