ios – 核心数据:语句仍然有效

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

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 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...