我的应用程序涉及一个主屏幕,其中包含一组数据的多个排序/查看选项。根据用户选择的内容,我可以列出它们,例如字母顺序,N最近,或以某种方式分组。
我启动了应用程序作为基于核心数据表的导航应用程序;我的app delegate设置了Core Data堆栈(未更改的生成代码),将NSManagedObjectContext
提供给初始屏幕的控制器,并将其传递给UITableViewController
实现我的“实体列表”。< / p>
由于我对同一数据的三个不同视图最终都显示了一个列出数据的表格,因此我将此类扩展为三个不同的NSFetchedResultsControllers
,每个都有一个UITableViewController
实例作为其委托。在将此视图控制器推入堆栈之前,我调用一种方法来切换要使用的NSFetchedResultsController
,例如
-(void)configureForMostRecent {
self.activeFetchedResultsController = self.mostRecentResultsController;
}
现在我收到来自Core Data的随机崩溃,例如NSInternalInconsistencyException
和其他类似的东西。有时,我使用应用程序,一切都很好,其他时候,它几乎立即崩溃。
所以,我的直觉是我的设计只是一个坏主意(tm)。
我是否应该坚持使用“一个UITableViewController
到一个NSFetchedResultsController
”模型并使用其他编码样式来减少样板?
答案 0 :(得分:1)
您可以使用一个提取控制器,根据需要调整提取谓词和重新提取。
修改强>
按照我的示例案例:
[NSFetchedResultsController deleteCacheWithName:@"MyObjectsCache"];
NSPredicate *_predicate = nil;
if (condition) {
_predicate = [NSPredicate predicateWithFormat:mySearchPredicateString];
self.currentTableView = searchDisplayController.searchResultsTableView;
}
else {
_predicate = [NSPredicate predicateWithFormat:myDefaultPredicateString];
self.currentTableView = tableView;
}
[fetchedResultsController.fetchRequest setPredicate:_predicate];
NSError *_error = nil;
if (![fetchedResultsController performFetch:&_error]) {
// handle error
}
答案 1 :(得分:1)
根据您目前为止所做的描述,使用多个NSFetchedResultsController
实例是完全有效的设计。
您是否尝试为每个NSFetchedResultsController
实例使用相同的缓存?当您切换到其他-reloadData
时,您是否在桌面上呼叫NSFetchedResultsController
?这两个都可能导致你看到的崩溃。
委托不是问题,但不是呼叫-reloadData
将是一个杀手。委托方法实际上只是在UITableView
NSFetchedResultController实例调用它们时更新NSFetchedResultsController changes. The fact that a reference to is passed into those delegate methods is a hint that they are designed to handle multiple
。