删除核心数据对象时出错:NSManagedObjectContext无法在其他上下文中删除对象

|| 尝试从核心数据存储中删除对象时遇到问题。调用
deleteOject
时收到的错误如下:
An NSManagedObjectContext cannot delete objects in other contexts.
我已经找到了一些有关此错误的在线文档,但主要与在多个线程中访问ManagedObjectContext有关,这可能会导致问题,但是我目前不在其他任何线程上工作。我遍历了我的代码,以确保除了在AppDelegate中创建的上下文之外,没有创建任何其他上下文,并且找不到可能的罪魁祸首。 我正在测试的代码如下:
NSMutableSet *remoteNids = [NSMutableSet setWithObjects:@\"140\", @\"141\", nil];
for (GCEvent *event in nodeEventsFromStore) {
    if (![remoteNids containsObject:event]) {
        NSLog(@\"Event no longer exists on remote. Removing object %@ from store.\", event);
        [[delegate managedObjectContext] deleteObject:event];
    }
    else {
        NSLog(@\"Event %@ exists on remote\", event);
    }
}
    
已邀请:
        Core Data对您说谎的可能性很小。我建议将断言放在这样的代码中:
NSAssert([delegate managedObjectContext] == [event managedObjectContext], @\"Found two contexts: %@ and %@\", [delegate managedObjectContext, [event managedObjectContext]);
在断点打开的情况下通过Xcode运行您的应用程序(因此在您断言时它会中断)并设置MallocStackLoggingNoCompact = YES。 触发断言后,可以使用gdb控制台,如下所示:
(gdb) info malloc [address of event\'s MOC]
(gdb) info malloc [address of delegate MOC]
这将打印分配堆栈跟踪,并向您显示创建两个Moc的位置。     
        解决此问题的最简单方法是先记录管理对象的上下文,然后记录每个“ 6”对象的“ 5”属性,然后再删除它。如果错误是正确的,则两个上下文的地址将不匹配。如果没有多个上下文,则每个ѭ6的
managedObjectContext
属性很可能是
nil
。 如果直接(即使用alloc-init)初始化托管对象,但再也没有通过将其ѭ5属性设置为上下文来将其分配给上下文,则会出现此错误。受管对象上下文会将自身以外的任何值视为另一个上下文,即使该值是nil值也是如此。     

要回复问题请先登录注册