我的应用程序出现以下错误:
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 个线程 = 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]];
希望这个回答对您有所帮助。
关于ios - 核心数据 : statement is still active,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883746/