iOS 8 CoreData问题 'NSInternalInconsistencyException',原因:'recordChangeSnapshot:forObjectID::在记录时全局ID可能不是临时的'

4

我在将我的App从iOS7迁移到iOS8时遇到了困难。在 iOS7 上,该应用程序运行完美。

但是,在保存时出现崩溃。

NSError *error = nil;
if (![managedObjectContext save:&error]) {  <---- crashes here
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
 }

我在stackoverflow上只看到了两个类似的问题,但是没有一个回答与我的问题相关。 iOS 8 CoreData Issue: recordChangeSnapshot:forObjectID:: global ID may not be temporary when recording iOS 8 Core Data Issue: global ID may not be temporary when recording 很难把所有代码都贴出来。我不知道从哪里开始调试!请帮忙。谢谢。

看起来我要改变整个核心数据ORM到ActiveRecord,只是为了避免这个问题。嗯…… - Wael
1个回答

10

这个[managedObjectContext save:&error]的调用是在后台线程上发生的吗?通常它会在主线程上被调用吗?

使用Core Data进行并发编程的推荐模式是线程限制:每个线程必须有自己完全私有的托管对象上下文。

在处理Core Data代码时,您可以使用isMainThread来确定是否在后台线程上,并在处理Core Data之前切换到主线程:

- (void)yourCoreDataTask {
    if (![[NSThread currentThread] isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self yourCoreDataTask];
        });
        return;
    }

    // Now on the Main Thread. Work with Core Data safely.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接