我仍在使用RSS阅读器,尽管它最终实现了不错的功能,但UI响应性在iPad 3上似乎很差。

为了改进我的应用程序,我检查了Internet上的许多资源,并碰到this interesting gem,在那儿,Marcus Zarra的方法(父母MOC致力于在后台保存到PSC中)引诱了我。

example provided by Matthew Morey看起来很漂亮,但是只考虑了一个操作:UITableView中条目的大量加载。

我试图在我的应用程序中实现此解决方案,但这显然是一团糟。
我有一个MasterViewController,它在启动时会创建一系列DBOperation对象,并将其发送到串行(最多1个并发)NSOperationQueue。

我的每个UIViewController都还执行单独的CoreData操作,它们分别保存(将帖子标记为编辑,将类别标记为打开或关闭,等等)。

因此,我的问题是:

  • 我应如何(简而言之)在我的应用程序中实现多上下文CoreData?
  • 哪个控制器应该添加哪个观察者以重新加载各自的UITableView?
  • 哪个控制器或委托应执行观察NSManagedObjectContextDidSaveNotification / mergechange操作?

  • 我对所有这些都感到非常困惑,马库斯·扎拉(Markus Zarra)的出色著作对我的帮助很小,也许是因为我从一开始就采取了错误的方式……

    在此先感谢您的帮助

    最佳答案

  • 每个线程基本上需要1个NSManagedObjectContext。
  • 为主线程创建一个上下文,所有视图控制器都将使用该上下文。在视图控制器中,您可以使用NSFetchedResultsController,因为它们的数据已更改时将通知它们,这可以自动触发tableview更新。
  • 每个后台线程都需要拥有自己的托管对象上下文。必须在该后台线程中创建此上下文,例如:
    NSManagedObjectContext *managedObjectConctext = [[[NSManagedObjectContext alloc] init] autorelease];
    [managedObjectConctext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    managedObjectConctext.undoManager = nil;
    managedObjectConctext.mergePolicy = NSOverwriteMergePolicy;
    
    return managedObjectConctext;
    
  • 因此,后台线程应仅将此上下文用于获取/更新托管对象。因此,最重要的规则是不要访问其他线程中的托管对象。 (或在一个上下文中获取并在另一个上下文中更新...)
  • 应该在主线程中的上下文上实现保存通知,因为后台上下文中的每个更新都将与主上下文合并,这将触发您的视图控制器更新其内容(适当时)。
  • 关于ios - 将多上下文CoreData应用于基于NSOperationQueue的应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19948553/

    10-14 09:48
    查看更多