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:)

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top