2012-11-29 118 views
4

很长时间以来,我一直在获取一个奇怪的bug,其中大部分表格视图变为黑色(只有几个单元格保持为http://cl.ly/LFlS),而在其他视图(连接到相同MOC)中出现一些其他视觉故障:http://cl.ly/LH3c(注意重复部分标题)。我一直认为这是CoreData的一个错误,但直到今天,我都再也没有把它重现到调试器上。下面是我得到异常权利之前它发生了:尝试插入nil对象的NSFetchedResultsController?

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. * -[__NSArrayM insertObject:atIndex:]: object cannot be nil with userInfo (null)

它停在[tableView endUpdates]行我controllerDidChangeContent:方法。然后,如果我点击继续,该应用程序不会崩溃,但用户交互变得非常缓慢。我看了看那个例外的原因,但找不到任何东西。任何线索?

我的NSFetchedResultsController更改处理看起来很像Apple的样板。我NSFRC的初始化看起来是这样的:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:[SWDataManager sharedManager].mainObjectContext]; 
[request setEntity:entity]; 

[request setFetchBatchSize:100]; 

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"sortName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 
[request setSortDescriptors:@[sortByName]]; 

fetchedResultsController = [[NSFetchedResultsController alloc] 
          initWithFetchRequest:request 
          managedObjectContext:mainObjectContext 
          sectionNameKeyPath:@"firstLetter" 
          cacheName:nil]; 

fetchedResultsController.delegate = self; 
[self refreshDataSource]; // set fetch request predicate and call performFetch on NSFRC 
return fetchedResultsController; 

编辑:我可以补充后那一堆对象接到了我MOC从表视图中删除,因此,这绝对发生。

按照要求,我controllerDidChangeContent:代码:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 

    // this updates the section index and footer cell and other kind of stuff 
    [self performSelector:@selector(layoutSpecialCells) withObject:nil afterDelay:0.3]; 
} 
+0

您将需要发布你的'-controllerDidChangeContent:'。 – Mundi

+0

@Mundi补充说。就像我说的那样,这没什么特别的...... – samvermette

+0

还添加了我的表格视图后,我得到异常的屏幕截图。 – samvermette

回答

3

我结束了请求与苹果TSI和这里的我得到了答案的要点:

To protect the integrity of the datastore, Core Data catches some exceptions that happen during it's operations. Sometimes this means that if Core Data calls your code through a delegate method, Core Data may end up catching exceptions your code threw.

In this case, Core Data caught an exception through from your -controllerDidChangeContent: method, caused by trying to use -insertObject:atIndex to put nil into an NSMutableArray.

因此基本上是异常是由我的代码抛出,而不必由Core Data框架。我还是没找到异常的根本原因,所以建议:

Multi-threading errors are the most common cause of mysterious Core Data issues.

走了很长的路要走,我意识到我的一些核心数据的代码没有被包囊在performBlock:电话。一旦我修好了,我再也看不到这个问题了。

+0

我有和你一样的问题,用swift和xcode 6.3和'performBlock'没有解决我的问题,但删除'estimatedHeightForRowAtIndexPath'似乎工作,但它只是覆盖没有修复它的错误... ... – Nico

0

为什么你[tableView endUpdates];之后更新UI?你为什么在一个单独的选择器上做延迟?

这在我看来非常可疑的设计和可能是你的问题的原因。我强烈建议你在指定的方法中执行由NSFetchedResultsControllerDelegate生成的所有UI更新。

+0

同意这是不好的设计。但就像我说的那样,该方法根本不会改变tableView的内容。这个方法非常冗长,所以我不会在这里发布它,但基本上它是这样的:1)在桌面视图顶部切换UILabel; 2)设置表格视图的页脚单元格; 3)更改表视图的contentInset和4)切换垂直滚动指示器。我会尝试禁用它,但我不确定这些事情会如何创建该错误... – samvermette

+0

也许有一个误解。 FRC委托方法响应底层数据中的更改,而不是表视图。你应该寻找修改你的对象图的代码行。 – Mundi

相关问题