首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定managedObjectContext

锁定managedObjectContext
EN

Stack Overflow用户
提问于 2012-10-04 09:02:22
回答 2查看 1.5K关注 0票数 1

我目前在一个(非常)大的应用程序开发的其他东西。

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

实际上,每次访问ManagedObjectContexts都是在几个块中进行的,对应于几个web服务.在几个线上。

文件上说这很糟糕。这就是为什么有时候,我的应用程序会冻结核心数据访问。

是的,我知道我应该

为每个线程创建单独的托管对象上下文,并共享一个持久存储协调器。

正如文档所述,但是代码已经存在,而且非常庞大,我的客户端需要一个快速的解决方案(就像往常一样)。

,所以问题是:

我见过一种[managedObjectContext lock]方法。好像是些信号量的东西。但医生没怎么说。

我的webservices,在不同的线程中使用相同的managedObjectContext实例。

-What,你想做什么

代码语言:javascript
复制
[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]

在我的每个web服务块中?

-Will这解决了冻结?

-Is是推荐的方法吗?

没有人告诉我关于lock & unlock 方法的信息,所以我做了一个编辑:

由于解冻并不是每次都会发生,所以我尝试了三种情况:

  • 不要保护我的数据访问
  • 使用[managedObjectContext lock] unlock]方法
  • 使用@synchronized(managedObjectContext) { ... }

在第一种情况下,在10次试验中发生了3次冻结。在第二和第三种情况下,根本没有冻结。

所以我的第二个问题是:

使用lock/unlock@synchronize( )有什么不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 15:59:45

我遇到了类似的问题,在现有代码上,我没有直接工作,块在单个托管对象上下文上执行提取,最后导致了奇怪的错误、冻结、线程退出等等。

我通过在上下文中添加一个正弦化来解决这个问题:

代码语言:javascript
复制
NSBlockOperation *myBlock = [NSBlockOperation blockOperationWithBlock:^{

  // block operation

  @synchronized(managedObjectContext) {

    NSArray *result = [managedObjectContext performFetch:myFetch];

   // error management following

  }
}];

这是我找到的最快的解决方案。我还试图添加某种锁定条件,但在某些情况下,线程出现了混乱和死锁。

票数 4
EN

Stack Overflow用户

发布于 2012-10-04 16:22:30

我不知道您需要运行哪些SDK,但如果可以使用iOS 5+ -performBlock:-performBlockAndWait:,可能正是您所需要的。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12723795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档