- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经阅读了大量关于后台核心数据处理的博客,但我并没有更深入地了解如何最好地管理同时触发所有 BG 核心数据任务并以未定义的方式通知主线程 MOC时间。
我知道您应该为每个 NSThread
拥有 1 个 NSManagedObjectContext
,并且通过订阅 NSManagedObjectContextDidSaveNotification
以及使用 [ context performBlock
我完成了一些不错的异步任务。
也就是说,我正在异步运行很多任务,我不能 100% 知道某些任务何时会重叠,而且我观察到竞争条件的形式是...
我的总体问题是如何解决多个 MOC 中的竞争条件?
如果正确的行为是每个线程有 1 个 MOC。我可以创建一个 NSThread ivar 并将我所有的核心数据工作放在上面吗?这样我就可以拥有一个与自身同步工作的 MOC?
我读过 NSLock 可能是避免某些代码同时从多个线程访问的解决方案..但我不知道我应该锁定什么?保存上下文方法?持久存储(似乎使多线程毫无意义)?
最后,我可以标记/编号/命名我的 MOC 吗?这样,如果我知道其他任务正在运行,我可以存储通知并按照它们实例化的顺序处理它们,以确保没有数据被覆盖?
最佳答案
建议每个线程一个 MOC。有异常(exception),但一般规则仍然适用。不要创建 NSThread 对象。只是不要。太痛苦了。而是使用 block 或 NSOperation 实例。它们更容易理解并保护您免受很多痛苦。
不要对 Core Data 使用锁。如果使用得当,Core Data 会自己加锁,如果你乱扔锁,就会导致问题。理想情况下,您应该永远需要在现代 Objective-C 中自己调用 lock。
除了具有对它们的 ivar 或属性引用之外,您不能命名 MOC。您也不需要。
使用 Core Data 进行多线程处理的最干净的方法如下:
理想情况下,每个后台进程都应该是一个数据孤岛,可以独立运行而不会与其他进程发生冲突。如果您有冲突,那么这是您需要在业务逻辑中解决的合并问题。
如果您遇到两个后台操作要访问同一 block 数据的情况,那么您应该按顺序运行它们,而不是并行运行。对相同数据的并行编辑等待发生是痛苦的,不要这样做。
您可以通过使用 NSOperationQueue
实例来控制事物是顺序的还是并行的。
遵循这些规则,您将不会出现竞争条件或死锁。
关于ios - 多个 NSManagedObjectContexts - 防止竞争条件和死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260578/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!