【发布时间】:2012-10-04 09:02:22
【问题描述】:
我目前正在使用由其他公司开发的(非常)大的应用程序。
开发得很好,代码看起来也不错……而不是访问核心数据。
确实,对ManagedObjectContexts 的每次访问都是在几个块中进行的,对应于几个 Web 服务......在几个线程中。
And the documentation says it's bad。这就是为什么有时我的应用在访问 Core Data 时冻结的原因。
是的,我知道我应该这样做
为每个线程创建一个单独的托管对象上下文并共享一个持久存储协调器
正如文档所说,但代码已经存在并且非常庞大,我的客户需要快速解决方案(像往常一样)。
那么问题来了:
我见过[managedObjectContext lock] 方法。这似乎是一些信号量的东西。但是文档并没有说太多。
我的 web 服务在不同的线程中使用 managedObjectContext 的同一个实例。
-你觉得做什么
[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]
在我的每个网络服务块中?
- 这会解决冻结问题吗?
-这是推荐的方式吗?
没有人告诉我lock 和unlock 方法,所以我做了一个编辑:
因为de freezes不会每次都发生,我尝试了3个案例:
不保护我的数据访问权限
使用
[managedObjectContext lock]unlock]方法使用
@synchronized(managedObjectContext) { ... }
在第一种情况下,10 次测试发生 3 次冻结。在第 2 和第 3 种情况下,根本没有冻结。
所以我的第二个问题:
lock/unlock 和 @synchronize( ) 有什么区别?
【问题讨论】:
标签: ios core-data locking nsmanagedobjectcontext