ios swift core-data nsfetchedresultscontroller magicalrecord

ios - NSFetchedResultsController llama didChangeObject delete en lugar de actualizar



swift core-data (2)

Este es el código, guardo el modelo a través de Magical Record:

MagicalRecord.saveWithBlock({ (localContext) -> Void in var localNotification = CDNotification.MR_findFirstByAttribute("notificationID", withValue: notification.notificationID, inContext: localContext) as CDNotification localNotification.readNumber = NSNumber(bool: true) })

Se llama a eliminar en lugar de actualizar después de llamar al código anterior:

func controller(controller: NSFetchedResultsController, didChangeObject object: AnyObject, atIndexPath indexPath: NSIndexPath, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath) { switch type { case NSFetchedResultsChangeType.Insert: self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) case NSFetchedResultsChangeType.Update: if let cell = self.tableView.cellForRowAtIndexPath(indexPath){ self.configureCell(cell as TableViewCell, atIndexPath: indexPath, withNotification: object as CDNotification) } self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) case NSFetchedResultsChangeType.Move: self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) case NSFetchedResultsChangeType.Delete: self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) default: return } }

Esto solo sucede si configuro el predicado para la solicitud de recuperación, en el ejemplo:

fetchRequest.predicate = NSPredicate(format:"user == john")


Lo que sucede aquí es que, en lugar del evento de cambio NSFetchedResultsChangeUpdate que espera, está obteniendo un NSFetchedResultsChangeDelete seguido de NSFetchedResultsChangeInsert . También puede ver un NSFetchedResultsChangeMove con la misma indexPath como origen y destino. Este es un problema conocido en varias versiones beta de iOS 9 22380191 y otras.


Lo sé, respuesta tardía, pero tal vez útil. Tuve el mismo problema con iOS 11.3 y Xcode 9.3 y me estaba volviendo loco. La solución fue proporcionar el tipo de datos correcto en la matriz de argumentos para el predicado. Después de cambiarlo de la interpolación de cadena al tipo esperado real ( NSNumber en ese caso particular), el NSFetchedResultsChangeType correcto fue Update lugar de Delete .

Elegí la interpolación de cadenas, porque el tipo de datos ( Bool en ese caso en particular), se usó como tipo escalar en el modelo Core Data y NSPredicate aceptó el tipo escalar durante la compilación, pero generó una excepción de tiempo de ejecución. Al cambiarlo a la interpolación de cadenas se corrigió el error de tiempo de ejecución y el predicado funcionó como se esperaba, excepto que se llamó al NSFetchedResultsChangeType incorrecto.

Por lo tanto, parece que el error en Core Data todavía existe o tal vez fue para forzar el uso correcto del tipo de datos.