【发布时间】:2012-07-13 10:53:43
【问题描述】:
我一直在寻找这个问题的解决方案,但目前还没有找到。
我正在开发一个包含核心数据的 iOS 应用。我创建了两个托管对象上下文 (MOC),它们指向同一个持久存储协调器。一个 MOC(称为 self.moc)以主队列并发启动,而另一个 mov(称为 self.bmoc)以私有队列并发启动。我确保 self.moc 只在主线程上运行,而 self.bmoc 只在其 performBlock 或 performBlockAndWait 块内运行。
但是,我遇到了这种奇怪的情况,我的应用程序在 [self.bmoc save:nil] 行冻结。由于保存操作是在 performBlock 块内执行的,我看不出它有什么原因会陷入死锁。由于它冻结在那条线上,即使我使用[self.bmoc save:&error] 而不是nil,我也不会收到错误。
下面是重现问题的代码。虽然我有许多类似于下面的功能,但只有 这个 会产生问题。我无法弄清楚问题的原因,非常感谢任何见解。谢谢!
-(void)createEmptyUserData {
[self.bmoc performBlock:^{
User* user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.bmoc];
/* sets user object */
[self.bmoc save:nil];
}];
}
注意:这段代码在主线程中执行。
【问题讨论】:
-
了解死锁发生在哪里?任何 validateSomething 方法或 willSave 方法锁定某些东西?死锁是2个线程互相等待,另一个线程在哪里等待?
-
感谢您的回复。执行完这段代码后,主线程继续运行并结束于
[self.bmoc performBlockAndWait^{}],等待上面的代码完成执行,导致主线程冻结。我不知道有任何 validateSomething 方法或 willSave 方法。 -
您可以尝试添加
-com.apple.CoreData.SQLDebug 3以打开调试,看看是否真的保存了任何内容。 -
也许这个块实际上正在等待前一个块完成,而这就是卡住的那个?
-
上下文是嵌套的还是只是共享同一个持久化 t 存储协调器?
标签: objective-c ios core-data deadlock nsmanagedobjectcontext