这是一个错误:
CoreData:错误:严重的应用程序错误。在调用- controllerDidChangeContent:期间,从NSFetchedResultsController的委托捕获了一个异常。尝试使用userInfo(null)删除并重新加载相同的索引路径({length = 2,path = 0-0})
这是我的典型NSFetchedResultsControllerDelegate:
NSFetchedResultsControllerDelegate
func controllerWillChangeContent(controller: NSFetchedResultsController) { tableView.beginUpdates() } func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) { let indexSet = NSIndexSet(index: sectionIndex) switch type { case .Insert: tableView.insertSections(indexSet, withRowAnimation: .Fade) case .Delete: tableView.deleteSections(indexSet, withRowAnimation: .Fade) case .Update: fallthrough case .Move: tableView.reloadSections(indexSet, withRowAnimation: .Fade) } } func controller(controller: NSFetchedResultsController, didChangeObject anObject: NSManagedObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch type { case .Insert: if let newIndexPath = newIndexPath { tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) } case .Delete: if let indexPath = indexPath { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } case .Update: if let indexPath = indexPath { tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None) } case .Move: if let indexPath = indexPath { if let newIndexPath = newIndexPath { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) } } } } func controllerDidChangeContent(controller: NSFetchedResultsController) { tableView.endUpdates() }
在viewDidLoad():
viewDidLoad()
private func setupOnceFetchedResultsController() { if fetchedResultsController == nil { let context = NSManagedObjectContext.MR_defaultContext() let fetchReguest = NSFetchRequest(entityName: "DBOrder") let dateDescriptor = NSSortDescriptor(key: "date", ascending: false) fetchReguest.predicate = NSPredicate(format: "user.identifier = %@", DBAppSettings.currentUser!.identifier ) fetchReguest.sortDescriptors = [dateDescriptor] fetchReguest.fetchLimit = 10 fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchReguest, managedObjectContext: context, sectionNameKeyPath: "identifier", cacheName: nil) fetchedResultsController.delegate = self try! fetchedResultsController.performFetch() } }
由于某种原因,先NSFetchedResultsController调用.Update后跟.Moveafter controllerWillChangeContent:。
NSFetchedResultsController
.Update
.Move
controllerWillChangeContent:
看起来就像这样: BEGIN UPDATES- > UPDATE- > MOVE- > END UPDATES 。
仅在iOS 8.x下发生
在一次更新会话期间,将重新加载和删除同一单元格,从而导致崩溃。
最简单的修复方法:
代码的以下部分:
case .Update: if let indexPath = indexPath { tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) }
用。。。来代替:
case .Update: if let indexPath = indexPath { // 1. get your cell // 2. get object related to your cell from fetched results controller // 3. update your cell using that object //EXAMPLE: if let cell = tableView.cellForRowAtIndexPath(indexPath) as? WLTableViewCell { //1 let wishlist = fetchedResultsController.objectAtIndexPath(indexPath) as! WLWishlist //2 cell.configureCellWithWishlist(wishlist) //3 } }
确实有效 。