1

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

为了改进我的应用程序,我检查了互联网上的许多资源并发现了这个有趣的宝石,Marcus Zarra 的方法(有一个致力于在后台保存到 PSC 的父 MOC)诱惑了我。

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

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

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

所以,我的问题是:

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

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

在此先感谢您的帮助

4

2 回答 2

2
  • 每个线程基本上都需要 1 个 NSManagedObjectContext 。

  • 为主线程创建一个上下文,所有视图控制器都将使用该上下文。在视图控制器中,您可以使用 NSFetchedResultsController,因为它们会在数据发生更改时收到通知,这可以自动触发 tableview 更新。

  • 每个后台线程都需要有自己的托管对象上下文。此上下文必须在该后台线程中创建,例如:

    NSManagedObjectContext *managedObjectConctext = [[[NSManagedObjectContext alloc] init] autorelease];
    [managedObjectConctext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    managedObjectConctext.undoManager = nil;
    managedObjectConctext.mergePolicy = NSOverwriteMergePolicy;
    
    return managedObjectConctext;
    
  • 因此,后台线程应该只使用这个上下文来获取/更新托管对象。所以最重要的规则是不要在其他线程中访问托管对象。(或者在一个上下文中获取并在另一个上下文中更新......)

  • 保存通知应该在主线程的上下文中实现,因为后台上下文中的每个更新都将与主上下文合并,这将触发您的视图控制器更新其内容(在适当的时候)。

于 2013-11-13T08:27:33.670 回答
1

Marcus S. Zarra 实际上在他出色的“Core Data 2nd Edition”一书中回答了我的问题(如果你今年只买一本 Core-Data 书,那就买一本吧!),他在并发性方面写了一个很好的章节。

我碰巧忽略了子/父关系如何与 MOC 一起工作。

save我刚刚了解到,使用父 MOC 声明的 MOC 但没有 PSC 会在调用其方法时将其更改“推送”到其父级。

如果我们的主线程 MOC 自己是使用他自己的私有队列的私有“作者”MOC 的子线程,那么我们可以级联save在我们的主 MOC 中非常快(不涉及磁盘),然后在私有的后台延迟编写器 MOC,从而保持 GUI 响应。

我还了解到,每当 MOC 使用私有队列时,他只能在一个performBlockperformBlockAndWait块内访问。

非常感谢您的帮助,Leijonien,您值得点赞!

于 2013-11-13T14:06:09.033 回答