我一直在尋找這個問題很長一段時間的解決方案,並且已經達到了一個。保存託管對象上下文在iOS 5的performBlock中創建死鎖
我正在開發具有核心數據的iOS應用程序。我創建了兩個指向同一個持久性存儲協調器的託管對象上下文(MOC)。一個MOC(稱爲self.moc)以主隊列併發啓動,而另一個M0C(稱爲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個線程正在彼此等待,另一個線程在哪裏等待? – 2012-07-13 12:19:16
謝謝你的回覆。在這段代碼執行完畢後,主線程繼續運行並結束於'[self。bmoc performBlockAndWait^{}]',它等待上面的代碼完成它的執行,導致主線程凍結。我不知道有任何validateSomething方法或willSave方法。 – 2012-07-13 13:30:04
您可以嘗試添加'-com.apple.CoreData.SQLDebug 3'來打開調試功能並查看是否有任何內容正在保存。 – 2012-07-13 13:44:32