代码之家  ›  专栏  ›  技术社区  ›  davetron5000

一个UITableViewController和许多NSFetchedResultsController-坏主意?

  •  1
  • davetron5000  · 技术社区  · 15 年前

    我的应用程序包含一个主屏幕,其中包含一组数据的多个排序/查看选项。根据用户的选择,我可能会列出它们,例如按字母顺序、N个最近的或以某种方式分组。

    我开始的应用程序作为一个核心数据表为基础的导航应用程序;我的应用程序委托设置核心数据堆栈(生成的代码不变),给出 NSManagedObjectContext 控制器的初始屏幕,并将其传递给 UITableViewController 实施我的“实体清单”。

    NSFetchedResultsControllers ,每个都有一个 表格控制器 实例作为其委托。在将这个视图控制器推到堆栈上之前,我调用一个方法来切换 NSFetchedResultsController

    -(void)configureForMostRecent {
      self.activeFetchedResultsController = self.mostRecentResultsController;
    }
    

    现在我从核心数据中得到随机崩溃,例如。 NSInternalInconsistencyException 还有其他类似的事情。有时,我使用这个应用程序,一切都很好,其他时候,它几乎瞬间崩溃。

    我应该坚持“一”吗 表格控制器 “有点像模型,只是使用其他编码样式来简化样板文件?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    5 年前

    使用多个 NSFetchedResultsController 实例是基于到目前为止您给出的描述的一个完全有效的设计。

    NSFetchedResultsController 实例?你在打电话吗 -reloadData NSFetchedResultsController

    更新

    代理不是问题,但不是调用 -重新加载数据 会成为一个杀手。委托方法实际上只是为了更新 UITableView NSFetchedResultsController changes. The fact that a reference to is passed into those delegate methods is a hint that they are designed to handle multiple

        2
  •  1
  •   Alex Reynolds    15 年前

    您可以使用一个fetch控制器,根据需要调整fetch谓词和重取。

    下面是我的例子:

    [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 
    }