1

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

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

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

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

是的,我知道我应该

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

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

所以这里的问题是:

我见过一种[managedObjectContext lock]方法。这似乎是一些信号量的东西。但是医生并没有说太多。

我的 web 服务在不同的线程中使用 managedObjectContext 的相同实例。

-你想做什么

[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]

在我的每个网络服务块中?
- 这会解决冻结问题吗?
- 这是推荐的方式吗?

没有人告诉我lock&unlock方法,所以我做了一个 EDIT :

因为 de freezes 不会每次都发生,所以我尝试了 3 种情况:

  • 不要保护我的数据访问

  • 使用[managedObjectContext lock] unlock]方法

  • 采用@synchronized(managedObjectContext) { ... }

在第一种情况下,10 次测试发生 3 次冻结。在第 2 和第 3 种情况下,根本没有冻结。

所以我的第二个问题:

lock使用/unlock和有什么区别@synchronize( )

4

2 回答 2

4

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

我通过在上下文中添加一个同步来解决:

NSBlockOperation *myBlock = [NSBlockOperation blockOperationWithBlock:^{

  // block operation

  @synchronized(managedObjectContext) {

    NSArray *result = [managedObjectContext performFetch:myFetch];

   // error management following

  }
}];

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

于 2012-10-04T15:59:45.550 回答
1

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

希望有帮助。

于 2012-10-04T16:22:30.100 回答