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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage