锁定 managedObjectContext

Posted

技术标签:

【中文标题】锁定 managedObjectContext【英文标题】:locking a managedObjectContext 【发布时间】: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]

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

没有人告诉我lockunlock 方法,所以我做了一个编辑:

因为de freezes不会每次都发生,我尝试了3个案例:

不保护我的数据访问权限

使用[managedObjectContext lock]unlock]方法

使用@synchronized(managedObjectContext) ...

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

所以我的第二个问题:

lock/unlock@synchronize( ) 有什么区别?

【问题讨论】:

【参考方案1】:

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

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

NSBlockOperation *myBlock = [NSBlockOperation blockOperationWithBlock:^

  // block operation

  @synchronized(managedObjectContext) 

    NSArray *result = [managedObjectContext performFetch:myFetch];

   // error management following

  
];

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

【讨论】:

谢谢你的回答,我明天试试。问题是很难重现冻结并查看问题是否已解决。 试试看这个问题,挺完整的,我曾经在两个选项之间做出选择:***.com/questions/1215330/…【参考方案2】:

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

希望对您有所帮助。

【讨论】:

以上是关于锁定 managedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何锁定一行及如何分析行锁定

MySQL数据库锁定机制

Cesium中的视角锁定

mysql数据库锁定机制

VBA 锁定有内容的单元格

锁定电脑后重登录,出现“引用账户当前已锁定,且可能无法登录”提示。是怎么回事?