NSFetchedResultsController fügt dieselbe Zelle nur dann in zwei Abschnitte ein, wenn der Controller im Begriff ist, einen weiteren Abschnitt einzufügen.
Das ist meinMessage.swift
Datei
@objc(Message)
class Message: NSManagedObject {
@NSManaged var content: String
@NSManaged var createdAt: NSDate
@NSManaged var identifier: Int64
@NSManaged var conversation: Conversation
@NSManaged var sender: Contributor
var normalizedCreatedAt: NSDate {
return createdAt.dateWithDayMonthAndYearComponents()!
}
}
So richte ich meinen FRC ein:
private func setupFetchedResultsController() {
let context = NSManagedObjectContext.MR_defaultContext()
let fetchRequest = NSFetchRequest(entityName: "Message")
let createdAtDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)
fetchRequest.predicate = NSPredicate(format: "conversation.identifier = %lld", conversation.identifier)
fetchRequest.sortDescriptors = [createdAtDescriptor]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "normalizedCreatedAt", cacheName: nil)
fetchedResultsController.delegate = self
try! fetchedResultsController.performFetch()
tableView.reloadData()
}
mit seinem Standarddelegierten.
AufviewDidLoad
Mein Controller hat 1 Abschnitt mit 1 Zeile. Ich drucke es auf der Konsole mit der folgenden Funktion:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("--->>>")
print(section)
print(fetchedResultsController.sections![section].objects!.count)
return fetchedResultsController.sections![section].objects!.count
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let message = fetchedResultsController?.objectAtIndexPath(indexPath) as! Message
let cellIdentifier = message.sender.identifier == Settings.currentUser?.profile?.identifier ? SentTableViewCellIdentifier : ReceivedTableViewCellIdentifier
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell
cell.cellTitleLabel?.text = message.content
return cell
}
und die Ausgabe ist wie folgt:
--->>>
0
1
Einmal versuche ich, nur EINE weitere Nachricht mit einem anderen Abschnitt hinzuzufügen, die folgende wird angezeigt:
--->>>
0
2
--->>>
1
1
und dann der Fehler:
CoreData: Fehler: Schwerwiegender Anwendungsfehler. Der Delegat von NSFetchedResultsController hat während eines Aufrufs von -controllerDidChangeContent: eine Ausnahme abgefangen. Ungültige Aktualisierung: Ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach der Aktualisierung (2) muss der Anzahl der Zeilen in diesem Abschnitt vor der Aktualisierung (1) plus oder minus der Anzahl entsprechen Anzahl der in diesen Abschnitt eingefügten oder gelöschten Zeilen (0 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der in diesen Abschnitt eingefügten oder herausgezogenen Zeilen (0 eingezogen, 0 ausgezogen). mit userInfo (null)
Warum passiert das?
NSFetchedResultsController
lädt aus irgendeinem Grund dieselbe Zelle in zwei Abschnitte:zuers undzweit. Warum
HINWEIS
Das Problem tritt NUR auf, wenn FRC einen neuen Abschnitt einfügt. Wenn eine Zeile in einen vorhandenen Abschnitt eingefügt werden muss, gibt es kein Problem. Das Problem hängt stark mit Abschnitten zusammen. Das Problem ist NUR, wenn FRC versucht, einen zweiten Abschnitt einzufügen. Wenn es um den dritten oder vierten Abschnitt geht, gibt es überhaupt kein Problem.