NSFetchedResultsController inserta la misma celda en dos secciones solo cuando el controlador está a punto de insertar otra sección
Este es miMessage.swift
archivo:
@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()!
}
}
Así es como configuro mi FRC:
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()
}
con su delegado estándar
EnviewDidLoad
mi controlador tiene 1 sección con 1 fila. Lo imprimo en la consola usando la siguiente función:
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
}
y la salida es la siguiente:
--->>>
0
1
Una vez que trato de agregar UNO otro mensaje con una sección diferente, aparece lo siguiente:
--->>>
0
2
--->>>
1
1
y luego el error:
CoreData: error: error grave de la aplicación. Se detectó una excepción del delegado de NSFetchedResultsController durante una llamada a -controllerDidChangeContent :. Actualización no válida: número no válido de filas en la sección 0. El número de filas contenidas en una sección existente después de la actualización (2) debe ser igual al número de filas contenidas en esa sección antes de la actualización (1), más o menos el número de filas insertadas o eliminadas de esa sección (0 insertadas, 0 eliminadas) y más o menos el número de filas movidas dentro o fuera de esa sección (0 movidas, 0 movidas). con userInfo (nulo)
¿Por qué sucede así?
NSFetchedResultsController
por alguna razón carga la misma celda en dos secciones:primero ysegundo. ¿Por qué?
NOTA:
El problema surge SOLO cuando FRC inserta una nueva sección. Si necesita insertar una fila en la sección existente, no hay problema. El problema es fuerte relacionado con las secciones.El problema es SOLO cuando FRC intenta insertar una SEGUNDA sección. Cuando se trata de la tercera o cuarta sección, no hay ningún problema.