核心数据:声明仍然有效

时间:2011-10-25 01:28:56

标签: ios core-data

我的应用中出现以下错误:

  

CoreData:错误:严重的应用程序错误。抓住了例外   在核心数据更改处理期间。这通常是一个bug   NSManagedObjectContextObjectsDidChangeNotification的观察者。   userInfo(null)

时语句仍然有效

我能找到的所有东西似乎都表明我的核心数据管理对象上下文可能存在多线程问题,但我似乎无法在我的应用程序中的任何地方找到这种情况。我正在后台线程上访问和管理托管对象上下文。上下文仅在该一个后台线程上获取和操作对象。当我通过NSManagedObjectContextObjectsDidSaveNotification检测到该上下文的保存时,我正在将更改合并到我只在我的主线程上访问的不同上下文中。当我调用合并更改时,会抛出错误。即使使用相同的数据集,也很少发生这种情况。

我在某处读到可以使用'-com.apple.CoreData.ThreadingDebug 3''启用多线程断言',但我无法使其工作。 有谁知道这是否可能?我希望这可能会打开一些断言,这些断言可以帮助我找到错误的线程或其他内容的上下文。

关于可能发生的事情或如何追踪此类问题的任何其他线索?

1 个答案:

答案 0 :(得分: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]];

希望这个答案有所帮助。