【发布时间】:2014-12-02 22:54:09
【问题描述】:
我已经阅读了大量关于后台核心数据进程的博客,但我还没有更深入地了解如何最好地管理许多同时触发的 BG 核心数据任务并在未定义的情况下通知主线程 MOC时间。
我知道每个 NSThread 应该有 1 个 NSManagedObjectContext,并且通过订阅 NSManagedObjectContextDidSaveNotification 以及使用 [context performBlock 我可以完成一些不错的异步任务。
也就是说,我正在异步运行很多任务,我不能 100% 知道一些任务何时会重叠,并且我观察到了以下形式的竞争条件......
- BG MOC 1 开始执行任务
- BG MOC 2 开始执行任务
- BG MOC 2 完成任务并发送保存通知
- BG MOC 1 完成任务并随后擦除 BG MOC 2s 更改
我的总体问题是如何解决多个 MOC 中的竞争条件?
如果正确的行为是每个线程有 1 个 MOC。我可以创建一个 NSThread ivar 并将我的所有核心数据工作放在上面吗?这样我就可以拥有一个与自身同步工作的 MOC?
我读过 NSLock 可能是避免同时从多个线程访问某些代码的解决方案。但我不知道我应该锁定什么?保存上下文方法?持久存储(似乎使多线程毫无意义)?
最后,我可以标记/编号/命名我的 MOC 吗?这样,如果我知道其他任务正在运行,我可以存储通知并按照它们被实例化的顺序处理它们,以确保没有数据被覆盖?
【问题讨论】:
标签: ios multithreading core-data concurrency nsmanagedobjectcontext