我查看了所有报告问题的帖子managedObjectContext save:
但是,我没有发现任何似乎可以解决我所看到的问题的东西。大多数人在协调他们的 FRC 与 tableView 时遇到问题。这是不同的。
当我在 NSManagedObjectContext 实例上调用 save 时,问题就暴露了。捕获并记录异常读取:“无法使用非集合对象执行集合评估”。有谁知道这可能意味着什么?
@try {
if ([self.managedObjectContext hasChanges]) {
@synchronized(managedObjectContext) {
if(![managedObjectContext save:&error]) {
NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n UserInfo: \n%@, %@", error, [error userInfo]);
[self.managedObjectContext rollback];
}
}
}
}
@catch (NSException *exception) {
NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n exception: \n%@\n%@", exception, error);
}
我唯一的线索是这个问题的可重复性。这发生在我取消保留的 fetchedResultsController 访问器之后,然后使用一组谓词实例化一个新的访问器。
if(searchFetchedResultsController) {
self.searchFetchedResultsController = nil;
}
self.searchFetchedResultsController = [predicateBuilder createSearchInContext:managedObjectContext forDelegate:self withSortDescriptors:self.sortDescriptors forEntityName:@"Record"];
NSError *error = nil;
[self.searchFetchedResultsController performFetch:&error];
if(error)
NSLog(@"\nfetch error: %@", error);
稍后我将通过使用正常的访问器构造来保留一个没有谓词的新 NSFetchedResultsController。
if(fetchedResultsController) {
self.fetchedResultsController = nil;
}
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
稍后我将添加一个 Record managedObject;节省; 并遇到保存抛出的异常。
有趣的是,这种情况每次都会发生,而且只有在我的谓词查询数字或日期时才会发生。查询字符串时不会发生。所以,我认为我的查询构造似乎是唯一的区别。事实是,两者都在创建有效的谓词(通过 SUBQUERY),因为 fetch 不会失败。所以,如果有区别,我无法告诉你它可能是什么。
其他值得注意的事情是我“分配”一个 FRC 的每个地方,它看起来像这样:
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
注意 nil cacheName 和 sectionNameKeyPath
我使用两个指针来阐明我的谓词 FRC 和非谓词 FRC。我知道如果我不提它会惹恼某人。
-(void) setSearchFilteredNames:(BOOL)boolValue {
searchFilteredNames = boolValue;
if(boolValue) {
self.searchFetchedResultsController.delegate = self;
self.fetchedResultsController.delegate = nil;
//self.fetchedResultsController = nil; //lazy regeneration
} else {
self.searchFetchedResultsController.delegate = nil;
//self.searchFetchedResultsController = nil; //lazy regeneration
self.fetchedResultsController.delegate = self;
}
}
此外,当我捕捉到异常时,新对象会被持久化。