5

我有一个应用程序,它使用表视图来显示我的核心数据的项目列表。我正在使用远程API,并且在下拉表视图后更新我的内容 - 这会触发对API的调用。NSFetchedResultsController委托异常

数据被检索,解析并插入/更新到我的核心数据中。

我是有时在保存我的Core Data上下文后出现错误......请注意,我没有为此使用多线程,就像我说过似乎并不总是发生。

我真的很生气。看来这家伙也有类似的问题,但我仍然无法修复矿用他的解决方案: CoreData error driving me crazy... CoreData: Serious application error. An exception caught from delegate of NSFetchedResultsController

以下是完整的错误:

2012-07-31 14:14:47.332 MyApp[2893:11303] 
*** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], 
/SourceCache/UIKit_Sim/UIKit-1914.84/UITableViewSupport.m:1133 
2012-07-31 14:14:47.332 MyApp[2893:11303] CoreData: error: Serious application error. 
An exception was caught from the delegate of NSFetchedResultsController during a call to - 
controllerDidChangeContent:. 
Attempt to create two animations for cell with userInfo (null) 

UPDATE

我有我的提取请求上的谓词。为了似乎删除以前从API下载的对象,以及从新的JSON结果中缺少的对象。我设置了一个hideFromUser标志,它保存在我的核心数据中。

如果此标志为YES,那么它不会出现在表格视图中。但如果没关系,那么它确实如此。如果有任何改变,我也会更新那个被管理对象的信息。是否有可能我有一个以前被设置为隐藏的对象,现在设置为显示,并且它也有一些新的数据,这可能触发“单元格应该更新”和“单元格应该插入”?

更多我认为它少似乎是相关的。

这里是我如何更新我的数据:

1)我设置了相应类型的所有相关对象“隐藏形式的用户”(NSPredicate确保他们不表视图显示)。

2)我从JSON数据中得到一个NSArray。

3)循环每个项目,我的createABookOfClass:withJSON:方法查询书籍的核心数据(使用来自json字典的ID),如果找不到它,它会创建一个新的。注意:此时“隐藏用户标志”被恢复。

4)毕竟完成后,我保存。

[[DPLocalStore getInstance] hideFlagItemsOfType:NSStringFromClass([MyFavouriteBook class])]; 

NSArray * itemsJSON = [data mutableObjectFromJSONData]; 

[itemsJSON enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) {  
    [[DPLocalStore getInstance] createABookOfClass:[MyFavouriteBook class] 
              withJSON:obj]; 
}]; 

NSError *error = nil; 
BOOL didsave = [[DPLocalStore getInstance] save:&error]; 

也许正在发生的事情是含有细胞对象A已经更新,它更新:隐藏标志已更改。因此,我要进入其中NSFetchedResultsController的委托想更新细胞,并将其删除也......自谓现在不对应于该对象的情况......那声音很可能...

+1

你可以发布您插入/更新数据的代码? – 2012-07-31 20:00:55

+0

这真的只是简单的解析JSON阵列并创建了一堆nsmanagedobjects的,在循环之后我保存上下文。这里没有什么特别的。也许如果我让你访问我的BitBucket回购?也许这两个动画为一个单元格...我只是有一个想法,请检查我更新的问题。谢谢。 – Daniel 2012-07-31 21:32:48

+0

Het Martin,我应该发布一些像你说的更多的代码,查看我的答案。干杯。 – Daniel 2012-08-01 18:05:02

回答

9

我认为我可能已经找到了错误,因为我改变了它,我没有经历过这个问题,所以我认为没关系。

我在执行的controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:我有这样的开关语句NSFetchedResultsChangeMove

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 

    // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
    [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] 
      withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

由于这是在旧的项目中使用(这点我是不的一部分),我以为整个controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:实施是好吧,因为这实际上更像是一个模板,而不是你自定义的东西。

其结果是,直到我在苹果开发者网站再次阅读了一下我没太注意它。我注意到,在NSFetchedResultsChangeMove的情况下,您必须删除一个单元格,并将该单元格插入新路径。然而,我没有真正意识到 - 删除单元格并重新加载部分!

实际上我应该和现在具备以下条件:

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

就像我说的,因为我已经没有任何问题。我很想从任何人那里知道内部工作是什么原因造成的 - 例外是“尝试为细胞创建两个动画”。

感谢您的任何权益。

+0

您节省了我的一天,谢谢! – 2013-04-26 12:17:15

+0

我想这里有一些教程或源代码,我们都复制和使用。由于这是样板文件...苹果公司在这里也有(正确的)实现http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/Reference/Reference.html – Daniel 2013-04-26 13:25:34

+0

此代码仍然错误。你应该在你的tableview操作的周围调用beginUpdate和endUpdate来插入/更新/删除。他们嵌套这些beginUpdate/endUpdates以定时同步表视图动画。这就是为什么你得到了重复的动画错误。 – Derek 2014-02-24 23:26:20

相关问题