2016-04-21 12 views
0

Ich habe ein seltsames Verhalten von NSFetchedResultsController. Ich möchte es mit meinem Array (nicht TableView) verwenden. Ich meine, mein Array sollte eine Liste von Objekten von NSFetcherResultsController enthalten.NSFetchedResultsController und Array. Einfügung

Ich schaffe meine Liste:

_ = try? controller.performFetch() 
var myList = controller.fetchedObjects?.map { MyModel($0) } 

Und es funktioniert. Aber ich habe Probleme, wenn ich myList aktualisieren sollte, wenn NSFetchedResultsController aktualisiert wird. Also, ich habe diese Methode:

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
    switch type { 
    case .Insert: 
     myList.insert(anObject, atIndex: newIndexPath!.row) 
    case .Delete: ... 

Und ich bekomme einen Absturz in dieser Zeile. Wenn zum Beispiel myList 40 Elemente enthält und 20 Elemente eingefügt werden sollen, dann kann newIndexPath gleich 53 sein, aber nicht 41. Ich meine, die Reihenfolge des Einfügens ist inkorrekt (vielleicht ist es ein Fehler von NSFetchedResultsController). Ich meine, anstatt Objekte der Ordnung 41,42,43,44,45,46 und so weiter einzufügen, fügt NSFetchedResultsController Objekte ein, etwa so: 53,56,42,58,43,46,44 und so weiter. Mit tableView funktioniert es, denn wenn didChangeObject Methode aufgerufen, dann enthält NSFetchedResultsController neue Daten bereits (60 Elemente). Aber wie kann ich Spiegel von NSFetchedResultsController Elementen bekommen?

Derzeit sehe ich nur eine Lösung. Ich sollte Updates speichern, und wenn die "controllerDidChangeContent" -Methode aufgerufen wird, sollte ich Updates nach indexPath sortieren und myList aktualisieren. Aber kann die bessere Lösung existieren?

+0

:) Pragmatische Programmierer zur Verfügung diskutieren, was den Vorteil ist 'NSFetchedResultsController' zu verwenden ** ** ohne einen Tisch Aussicht? Der Hauptzweck besteht darin, die Benutzeroberfläche (Tabellenansicht) als Reaktion auf Änderungen des 'NSManagedMangedContext' zu steuern. – vadian

+0

Haben Sie eine Anforderung, den vorhandenen Inhalt von' myList' beizubehalten, oder können Sie einfach die gesamte Liste neu erstellen? – Wain

+0

Ich benutze meine benutzerdefinierte Ansicht mit Sammlungsstruktur. In Bezug auf Freizeit-Liste - ich kann es tun, aber wenn ich viele Elemente habe, dann kann es lange dauern –

Antwort

0

Ich empfehle nicht, eine NSFetchedResultsController mit etwas anderem als einer Tabellenansicht zu verwenden. Es ist einfach nicht für etwas anderes gedacht.

Sie sind viel besser dran, einfach für NSManagedObjectContextDidSaveNotifications zuhören und auf sie selbst reagieren. Sie können leicht Ihren eigenen Context Watcher (effektiv die gleiche Kernfunktion wie ein NSFetchedResultsController) implementieren, der Ihnen genau das gibt, was Sie brauchen, anstatt zu versuchen, mit dem NSFetchedResultsController in einer Situation zu ringen, für die es nicht bestimmt ist.

Es gibt viele Beispiele im Netz und ich es auch im Detail in meinem Buch auf Kerndaten aus dem

+0

Also, wenn ich iCarousel oder eine benutzerdefinierte Ansicht mit Collection-Struktur verwenden, sollte ich "benutzerdefinierte" nfetchedresultscontroller erstellen? –

+0

Nicht so gute Lösung :) –

+0

Erstellen Sie Ihre eigenen Beobachter von Core Data ist trivial und erwartet Verhalten auf iOS, wenn Sie eine benutzerdefinierte Benutzeroberfläche erstellen. Ich weiß nichts über iCarousel oder anderen Code von Drittanbietern, aber wenn Sie Ihren eigenen Code erstellen, ist es trivial, Änderungen in Core Data zu überwachen und darauf zu reagieren. NSFRC ist mehr eine Demonstration als eine endgültige Antwort für alle UI-Interaktionen. –

Verwandte Themen