锁定managedObjectContext

时间:2012-10-04 09:02:23

标签: ios core-data locking nsmanagedobjectcontext

我目前正处于由其他人开发的(非常)大型应用程序中。

它开发得很好,代码看起来很不错......而不是访问核心数据。

实际上,对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( )有什么区别?

2 个答案:

答案 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:可能就是您所需要的。

希望有所帮助。

相关问题