我有3個MOC。撤消管理器和多個MOC
- MainThread MOC顯示的東西(帶的UndoManager)
- 背景保存MOC來保存數據到光盤(連接到存儲)
- Backgorund更新MOC從服務器下載數據,分析它並保存後
他們是親子關係。
- 背景更新 - > 1. MainThread - >背景保存(存儲)
現在,當我從後臺我需要在mainthread禁用的UndoManager所以他們無法撤消下載數據 - 這可能是用戶正在同時編輯某些內容的情況。
現在問題是如果這是正確的。我在後臺更新線程代碼
//create child background context which is child of 1. MainThread
NSManagedObjectContext* context = [[AppManager sharedAppManager] createChildManagedObjectContext];
//I'M DOING ALL CHANGES ON DATA HERE
[context.parentContext.undoManager disableUndoRegistration]; //disable undo on main thread
[context save:nil]; //save changes to background thread
[context.parentContext save:nil]; //save changes to main thread
[context.parentContext processPendingChanges]; //process changes on main thread
[context.parentContext.parentContext save:nil]; //save data to disc on 3. save-thread
[context.parentContext.undoManager enableUndoRegistration]; //enable undo again
積木,它看起來像:
[context.parentContext performBlockAndWait:^{
[context.parentContext.undoManager disableUndoRegistration];
[context performBlockAndWait:^{
[context save:nil];
}];
[context.parentContext save:nil];
[context.parentContext processPendingChanges];
[context.parentContext performBlockAndWait:^{
[context.parentContext.parentContext save:nil];
}];
[context.parentContext.undoManager enableUndoRegistration];
}];
我這麼問是因爲偶爾我得到了一些不一致的崩潰,我真的不能找到一個理由對於那些。
嗨,謝謝你的提示。我正在使用performBlockAndWait,因爲我在壓力測試應用程序期間可以產生一些崩潰。在主線程中進行壓力測試EDIT/SAVE時,在背景中進行更新。隨着performBlock UndoManager進入一些不穩定的狀態,並在該過程中崩潰。我會通讀您的評論,並根據您的建議重新考慮我的解決方案 - 我可能會對此有所疑問,但需要先分析它:) –
如果'performBlockAndWait'可以防止崩潰......這意味着您在同步問題中其他可能在不阻礙操作的情況下解決的領域。 –
接受答案 - 花了我一段時間找到解決方案,但我最終扔掉undomanager和做的東西在單獨的上下文,我扔掉了,如果用戶取消。這解決了我的大部分問題,thx的想法。 –