我有iOS中9核心數據有問題,我沒有在iOS的8的iOS 9核心數據線程
我有多個NSManagedObjectContext
對象的環境。父context
是併發類型NSMainQueueConcurrencyType
,並且所有視圖控制器都有自己的子對象context
。我使用這種系統的原因是因爲我想擁有更多獨立的contexts
,並且只有在我決定完成時才合併它們。子context
在私有隊列上,因爲它在後面的線程上工作,然後在父主線context
上工作,父主線程將更改傳播到數據庫並在主線程上完成它所需的工作。
所有這一切都很好,直到iOS 9。我得到的行爲是相當奇怪的。例如,當我添加A類型的新對象時,它會傳播到存儲。如果我在同一個vc上添加另一個類型爲A的對象,使用相同的context
,但是從另一個按鈕,moc的performBlockAndWait:
未被調用,並且我的應用凍結,控制檯中沒有任何消息。如果嘗試使用第一個按鈕,它會每次都通過。
- (BOOL)saveChildContext:(NSManagedObjectContext*)childContext
{
[childContext performBlockAndWait:^{
NSError* error;
[childContext save:&error];
[_managedObjectContext performBlock:^{
NSError* parentError;
[_managedObjectContext save:&parentError];
}];
}];
}
如果我叫performBlock:
,一切都在這兩種情況下的罰款。所以我想通了,這可能是由於一些錯誤的線程。另一方面,使用相同類型的對象相同的線程,但另一個按鈕,一切都很好。這讓我感到困惑,並且懷疑它與線程有關。
我的問題:
1)是否會對後面的線程子context
對象,並有context
是保存到數據庫,再返回到GUI上的主線,還是有更好的慣例的正確方法,並如果有的話,爲什麼?
2)代碼在iOS 8上工作。但是,它似乎不會輸入performBlockAndWait:
方法。爲什麼有時這個塊不會被執行?是否有其他線程阻塞?如何找出這是否是這種情況?
要解決您的按鈕的特定問題,您必須發佈顯示兩個按鈕之間區別的代碼。 – Mundi
我認爲問題可能在於,因爲其他選項從未造成死鎖或其他任何事情。不知何故,我使用了兩種不同的上下文。我真的不知道我是如何設法建立由兩個不同的上下文獲取的兩個對象之間的關係。還有一點很奇怪的是,當我調用異步performBlock時,它仍然沒有問題地到達DB。 –