2012-09-30 28 views
0

我的代碼使用核心數據執行大量任務,然後當我去保存時,它崩潰而沒有任何錯誤。我的保存代碼很簡單:應用程序退出[managedObjectContext save:]無錯誤

[[self managedObjectContext] save:&error]; 

NSLog(@"Error: %@", error); 

它沒有到達錯誤行,它崩潰並退出到主屏幕的那一點。

我在診斷程序中選擇了「Guard Malloc」以外的其他所有內容。

這是日誌我得到,當它運行保存命令:

CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
CoreData: sql: COMMIT 
CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: INSERT INTO ZENTRY(Z_PK, Z_ENT, Z_OPT, ZLOCATION, ZBOOKMARKED, ZCREATIONDATE, ZENTRYID, ZMESSAGE, ZSECTIONIDENTIFIER, ZTICDSSYNCID, ZVERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
CoreData: sql: COMMIT 
CoreData: sql: pragma page_count 
CoreData: annotation: sql execution time: 0.0047s 
CoreData: sql: pragma freelist_count 
CoreData: annotation: sql execution time: 0.0069s 

沒有任何錯誤的提及此之前。我怎樣才能知道什麼是崩潰我的應用程序?

編輯:我現在知道這發生在[NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]];調用後,並且它是由TICoreDataSync在此之前在我的核心數據存儲上執行的方法引起的。我無法更改該代碼,或將其從我的核心數據存儲中移除。我認爲與多線程訪問存儲有關的問題,所以現在我需要知道如何在主線程上處理這個問題?

回答

3

顯然MOC已損壞。它是從多個線程訪問嗎?

我會做的是,隨着每一個變化(其中moc是可保存的 - 一致的),嘗試保存。腐敗發生的地方將會崩潰,所以你現在至少知道問題出在哪裏。

我在我的應用程序中執行此操作 - 事實上,所有開發版本都會不斷保存,只有部署和QA構建將此功能關閉。我發現了許多這樣的錯誤。將這些保存包含在某些標記語句或編寫宏中。

+0

我把它移動了一下,發現只有在調用'[NSEntityDescription insertNewObjectForEntityForName:@「Entry」 inManagedObjectContext:[self managedObjectContext]];''後纔會發生。這仍然是主要的上下文,所以我認爲它必須是運行在後臺上下文中的其他代碼。我有TICoreDataSync與Dropbox設置,並且在代碼發生之前在覈心數據存儲上運行,這就是導致問題的原因,但我無法更改它們的代碼。我如何使它與後臺線程兼容? – Andrew

+0

這是一個開源庫 - 您可以訪問他們的代碼。找出如何共享相同的調度隊列。我沒有經驗,但至少現在你知道問題了。在他們的github網站上發佈求助請求,或者谷歌那個庫以及'如何共享一個調度隊列' - 類似的東西。 –