我目前正处于由其他人开发的(非常)大型应用程序中。
它开发得很好,代码看起来很不错......而不是访问核心数据。
实际上,对ManagedObjectContexts
的每次访问都是在几个块中进行的,对应于几个Web服务......在几个线程中。
And the documentation says it's bad。这就是为什么有时我的应用会冻结核心数据访问权。
是的,我知道我应该
为每个线程创建单独的托管对象上下文,并共享一个持久性存储协调器
正如文档所说,但代码已经存在且非常庞大,我的客户需要快速解决方案(像往常一样)。
所以这就是问题:
我见过[managedObjectContext lock]
方法。它似乎是一些信号量的东西。但是文件并没有说太多。
我的webservices,在不同的线程中使用的是managedObjectContext的相同实例。
- 你怎么看待
[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]
在我的每个网络服务块中? - 这会解决冻结问题吗? - 这是推荐的方式吗?
没有人告诉过我lock
& unlock
方法,所以我做了编辑:
因为每次都不会发生de冻结,我尝试了3种情况:
不保护我的数据访问
使用[managedObjectContext lock]
unlock]
方法
使用@synchronized(managedObjectContext) { ... }
在第一种情况下,在10次测试中发生冻结3次。在第二和第三种情况下,根本没有冻结。
所以我的第二个问题:
使用lock
/ unlock
和@synchronize( )
有什么区别?
答案 0 :(得分:4)
我有一个类似的问题,对于我没有直接工作的现有代码,块在单个托管对象上下文中执行获取,最终出现奇怪的错误,冻结,线程退出等。
我通过在上下文中添加一个sinchronize来解决:
NSBlockOperation *myBlock = [NSBlockOperation blockOperationWithBlock:^{
// block operation
@synchronized(managedObjectContext) {
NSArray *result = [managedObjectContext performFetch:myFetch];
// error management following
}
}];
这是我找到的最快的解决方案。我还尝试添加某种锁定条件,但在某些情况下,线程正在搞乱和死锁。
答案 1 :(得分:1)
我不知道您需要运行哪些SDK,但如果您可以使用iOS 5+ -performBlock:
而-performBlockAndWait:
可能就是您所需要的。
希望有所帮助。