感謝您的閱讀。我們已經收到了崩潰報告對我們的iOS應用程序,出現以下錯誤:「'NSInternalInconsistencyException'的替代原因,原因:'此NSPersistentStoreCoordinator沒有持久存儲'。」
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
這發生在我們的主隊列的NSManagedObjectContext試圖保存:
:BOOL saved = [managedObjectContext save:&error];
在哪一個塊中出現通過提交
[managedObjectContext performBlockAndWait:saveBlock];
互聯網(特別是SO)充滿了對這個錯誤的解釋,表明我們從來沒有一個持久的商店cooridinater(我們沒有創建它適當的時候whe ñ我們建立了核心數據堆棧)。但是,如果沒有持久性商店協調員,我們很難看到如何在程序執行中實現這一點。對於踢球,我評論了我們設置持久存儲和應用幾乎立即崩潰的路線(沒有進入我們的保存方法)。
有誰知道是否有這種異常的替代原因,還是總是因爲沒有持久存儲?有什麼方法可以丟失持久性商店?
多一點顏色:我們使用父/子NSManagedObjectContexts爲了在後臺線程中加載數據。完整的保存方法是這樣的:
-(void)saveWithManagedObjectContext:(NSManagedObjectContext*)managedObjectContext successHandler:(void (^)())successHandler failureHandler:(void (^)(NSManagedObjectContext* managedObjectContext, NSError*))failureHandler
{
void(^saveBlock)() = ^() {
NSError *error = nil;
BOOL saved = [managedObjectContext save:&error];
if (!saved) {
if (error != nil) {
NSLog(@"Unresolved error saving %@, %@", error, [error userInfo]);
}
failureHandler(managedObjectContext, error);
} else {
if (managedObjectContext.parentContext != nil) {
[self saveWithManagedObjectContext: managedObjectContext.parentContext successHandler:successHandler failureHandler:failureHandler];
} else {
successHandler();
}
}
};
BOOL isMainContext = managedObjectContext.parentContext == nil;
if (isMainContext) {
[managedObjectContext performBlockAndWait:saveBlock];
} else {
[managedObjectContext performBlock:saveBlock];
}
}
它可以從一個後臺線程調用,它將調用保存:對的NSManagedObjectContext通過performBlock:然後rescursively呼籲家長的NSManagedObjectContext這個方法,以保存。當應用程序崩潰時,它始終在主線程上,因爲主隊列上下文是唯一需要持久存儲的上下文。
非常感謝您的幫助。我確實在devforums.apple.com上發帖,所以如果你看過兩次,我很抱歉。
感謝蒙迪。核心數據堆棧構建得很好(如果我在構建堆棧時將持久性存儲顯式設置爲零,應用幾乎會立即崩潰)。對於我的後臺上下文,那些總是在實例化時立即設置他們的parentContext。 – kalperin