NSFetchedResultsController insere a mesma célula em duas seções somente quando o controlador está prestes a inserir outra seção
Este é meuMessage.swift
Arquivo:
@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()!
}
}
É assim que eu configuro meu 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()
}
com seu delegado padrão.
EmviewDidLoad
meu controlador tem 1 seção com 1 linha. Imprimo-o no console usando a seguinte função:
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
}
e a saída é a seguinte:
--->>>
0
1
Depois que tento adicionar apenas UMA outra mensagem com uma seção diferente, recebo o seguinte:
--->>>
0
2
--->>>
1
1
e então o erro:
CoreData: error: Erro sério de aplicativo. Uma exceção foi capturada pelo delegado de NSFetchedResultsController durante uma chamada para -controllerDidChangeContent :. Atualização inválida: número inválido de linhas na seção 0. O número de linhas contidas em uma seção existente após a atualização (2) deve ser igual ao número de linhas contidas nessa seção antes da atualização (1), mais ou menos o número de linhas inseridas ou excluídas dessa seção (0 inserido, 0 excluído) e mais ou menos o número de linhas movidas para dentro ou para fora dessa seção (0 movido para dentro, 0 movido para fora). com userInfo (nulo)
Por que isso acontece assim?
NSFetchedResultsController
por algum motivo, carrega a mesma célula em duas seções:primeiro esegundo. Por quê?
NOTA:
O problema surge apenas quando o FRC insere uma nova seção. Se precisar inserir linha na seção existente, não há problema. O problema é forte relacionado às seções.O problema é SOMENTE quando o FRC tenta inserir uma segunda seção. Quando se trata da terceira ou quarta seção, não há nenhum problema.