2011-10-25 80 views
12

我得到我的應用程序出現以下錯誤:核心數據:聲明仍然有效

我能找到

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. statement is still active with userInfo (null)

一切似乎預示着我可以有我的核心數據管理對象多線程問題上下文,但我似乎無法在我的應用程序的任何地方找到這種情況。我正在訪問和管理後臺線程上的託管對象上下文。上下文只是獲取和操作該背景線程上的對象。當我通過NSManagedObjectContextObjectsDidSaveNotification檢測到對上下文的保存時,我將這些更改合併到僅在我的主線程中訪問的不同上下文中。當我調用合併更改時,會引發錯誤。發生這種情況非常罕見,即使使用相同的數據集。

我在某處讀了'使用'-com.apple.CoreData.ThreadingDebug 3'來啓用多線程斷言',但是我一直無法讓它工作。 有誰知道這是可能的嗎?我希望這可能會打開一些能夠幫助我找到我在錯誤線索或其他地方使用上下文的說法。

有關可能發生的事情或如何跟蹤這類問題的其他線索?

+1

我的回答有幫助嗎? –

+0

您在[TN2124:Mac OS X調試魔術](https://developer.apple.com/library/ios/#technotes/tn2004/tn2124.html#SECCOREDATA)中閱讀。關鍵是,「這個功能需要框架的調試版本。」如果你有這個變體,你可以設置環境變量'DYLD_IMAGE_SUFFIX = _debug',它會爲框架加載'CoreData_debug'而不是'CoreData'。不幸的是,這些變體似乎只適用於OS X 10.5.x. :( –

回答

13

我有一個類似的問題,並找到了解決辦法。

我創建了一個基於線程名稱創建不同上下文的機制(1線程= 1上下文)。

#include <pthread.h> 
... 

    mach_port_t threadID = pthread_mach_thread_np(pthread_self()); 
    NSString *threadName = [NSString stringWithFormat:@"%x", threadID]; 
    NSManagedObjectContext *context = [singleton.threadsContexts objectForKey:threadName]; 
    if (!context) { 
     NSLog(@"Creating managed context for thread named '%@'", threadName); 
     context = [[NSManagedObjectContext alloc] init]; 
     [context setPersistentStoreCoordinator:[singleton.managedObjectContext persistentStoreCoordinator]]; 

     //initialize dictionary in your singleton if it as not been yet 
     if(!singleton.threadsContexts) 
     { 
      singleton.threadsContexts = [NSMutableDictionary new]; 
     } 
     [singleton.threadsContexts setObject:context forKey:threadName]; 
    } 

    return result; 

,然後,當我在後臺線程需要一個完整的版本管理對象的,我得到專門爲這個線程對象的副本:

NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]]; 

希望這個答案會有所幫助。

+1

[[NSThread currentThread] name]在iOS 7上爲我返回「」。[This answer](http://stackoverflow.com/a/15523049/1571490)給了我一個正確的字符串。除此之外,它的工作完美無缺並看起來像我所有的核心數據線程問題已修復。謝謝! – fifarunnerr

+0

工程很棒!我沒有看到我的崩潰,因爲我一直在使用這個代碼!我也必須使用fifa的技術來獲取線程名稱另一個提示, t忘記初始化你的單身人士的NSMutableDictionary ...我跑了一圈,直到我意識到:DUH :: – RyanG

+1

這是一個相當舊的答案,對於較新的項目,我使用魔法記錄有一個內置支持多線程核心數據文檔不是很好,但是一旦你知道如何使用這個庫文件,它會節省很多時間https://github.com/magicalpanda/MagicalRecord –