ios - 将多上下文 CoreData 应用于基于 NSOperationQueue 的应用程序

标签 ios uitableview core-data concurrency nsmanagedobjectcontext

我仍在研究我的 RSS 阅读器,虽然它最终实现了不错的功能,但在 iPad 3 上的 UI 响应性似乎非常糟糕。

为了改进我的应用程序,我在互联网上查阅了许多资源,结果发现 this interesting gem Marcus Zarra 的方法(有一个父 MOC 致力于在后台保存到 PSC)诱惑了我。

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

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

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

所以,我的问题是:

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

  • 我真的对这一切感到困惑,而 Markus Zarra 的优秀著作对我的帮助太少了,也许是因为我从一开始就走错了路……

    在此先感谢您的帮助

    最佳答案

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

    相关文章:

    iOS - 导航栏内的动画不起作用

    swift - UITableView reloadData() 覆盖以前的单元格数据

    objective-c - 在哪里设置弹出窗口大小?

    ios - 核心数据/NSOperation : crash while enumerating through and deleting objects

    ios - 使用核心数据创建实体关系

    ios - Split View到 iOS 中的另一个全 View Controller

    ios - 如何在 Swift 中从套接字播放原始音频数据

    ios - Google Maps URL Scheme 不显示标记

    ios - 从自定义单元格中检测 UIImageView 上的触摸

    cocoa - 未针对所有属性调用 keyPathsForValuesAffectingValueForKey