基于NSFetchedResultsController的表视图总是在SECOND插入实体时失败

Dre*_*w C 5 iphone core-data nsfetchedresultscontroller

我正在使用NSFetchedResultsController来管理在具有一个部分的表视图中显示已提取的托管对象.该表开始为空,用户可以使用UI向其添加新实体.目前,程序在添加第一个实体时始终有效,并且在添加第二个实体时始终崩溃.在崩溃时有时没有出现错误,有时会出现不同类型的错误(下面包括一些错误).通过日志语句和跟踪,我看到程序在NSFetchResultsController的委托的controllerWillChangeContent(调用[self.tableView beginUpdates];)方法之后崩溃,但在我的代码中的任何其他方法被调用之前.以下是我的代码中的一些相关部分.配置NSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer"
                                    inManagedObjectContext:self.managedObjectContext]];

// Configure request's entity and predicate
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
[fetchRequest setPredicate:predicate];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.managedObjectContext
                                                               sectionNameKeyPath:nil
                                                                        cacheName:nil];
self.resultsController.delegate = self;
[fetchRequest release];

NSError *error = nil;
BOOL success = [resultsController performFetch:&error];
if (!success) {
    NSLog(@"Error fetching request %@", [error localizedDescription]);
}
Run Code Online (Sandbox Code Playgroud)

添加新实体:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext];
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
beer.name = beerName;
beer.brewery = self.brewery;
Run Code Online (Sandbox Code Playgroud)

我已经在文档中看到了有关显示包含一个部分的表的问题的警告,并且我使用Apple的解决方法无效.无论如何,这些方法在崩溃之前都没有被调用.

我收到的一些错误:

Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,即使没有对代码进行任何更改,错误(当呈现错误时)也不一致.

谁能弄清楚我做错了什么?

Mar*_*rra 4

您不一致的错误表明可能存在过度发布问题。特别是因为将您的委托更改为仅重新加载数据可以使问题消失。就我个人而言,我会投入时间来解决问题,而不是围绕它进行编码,因为您肯定会遇到代码问题,并且稍后可能会在其他地方出现。

我会做以下事情:

  1. 打开 NSZombie
  2. 添加断点objc_exception_throw
  3. 在调试器中运行

当异常发生时,查看内存地址,看看正在访问什么以及在哪里。这将隔离问题并告诉您发生了什么。如果这没有揭示问题,那么发布您的NSFetchedResultsController委托方法也会很有帮助,这样我就可以看看它们是否有任何奇怪的地方。

最好用附加信息更新原始问题。