我的应用程序中出现以下错误:
CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误.userInfo语句仍然有效(null)
我能找到的所有东西似乎都表明我可能在我的核心数据管理对象上下文中存在多线程问题,但我似乎无法在我的应用程序中的任何地方找到这种情况.我正在后台线程上访问和管理托管对象上下文.上下文仅在该一个后台线程上获取和操作对象.当我通过NSManagedObjectContextObjectsDidSaveNotification检测到该上下文的保存时,我正在将更改合并到我只在我的主线程上访问的不同上下文中.当我调用合并更改时,会抛出错误.即使使用相同的数据集,也很少发生这种情况.
我在某处读到可以使用'-com.apple.CoreData.ThreadingDebug 3''启用多线程断言',但我无法使其工作.有谁知道这是否可能?我希望这可能会打开一些断言,这些断言可以帮助我找到我在错误的线程或其他东西上使用上下文的位置.
关于可能发生的事情或如何追踪这类问题的任何其他线索?
Dir*_*nry 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;
Run Code Online (Sandbox Code Playgroud)
然后,当我在后台线程中需要完整版本的托管对象时,我得到了一个专用于该线程的对象的副本:
NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]];
Run Code Online (Sandbox Code Playgroud)
希望这个答案会有所帮助.