尝试清除和保存不同的上下文时访问错误

Bad access when trying to clear and save different contexts

我需要定期更新我坚持使用的数据 Core Data。我从对 REST 服务的异步调用中获取此类数据。为了首先检索所有数据,我在私有队列中创建了一个完整的核心数据堆栈,然后我这样做:

- (void)updateDataFromServices
{
   [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
   self.dataUpdatePrivateContext = [MyCoreDataStackHelper getPrivateContext];

   if (self.dataUpdatePrivateContext != nil) {
       [self.dataUpdatePrivateContext performBlockAndWait: ^{
           // Asynchronous operations
           [self callService1];
           [self callService2];
           [self callService3];
       }];
   }
}

在调用的每个服务的回调中,我检查其余服务是否也已完成,如果全部完成,我调用一个方法 (manageInfoUpdate) 来处理数据之间的更新我在我的主上下文中(在主线程中)和我现在在私有上下文中(在私有队列中)的数据:

- (void)manageInfoUpdate
{
   const char* UpdateInfoQueue = "com.comp.myapp.updateinfo";
   dispatch_queue_t queue = dispatch_queue_create(UpdateInfoQueue, NULL);
   dispatch_async(queue,^{

    // Handle updates from private context:
    // Here I compare objects in the main context with the objects
    // in the private context and I delete objects from both
    // by calling:

    [mainContext deleteObject:object];
    [self.dataUpdatePrivateContext deleteObject:object];
    // This seems to work...

    // Save and clear private context
    [self saveContext:self.dataUpdatePrivateContext];
    [self clearContext:self.dataUpdatePrivateContext];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Re-fetch from main context to get
        // the updated data

        // Save main context
        [self saveContext:mainContext];

        // Notify end of updates
    });
});
}

我尝试在另一个异步线程中执行 manageInfoUpdate 操作。我在尝试清除/保存上下文时遇到 EXEC_BAD_ACCESS 异常...有人可以帮我找出原因吗?

提前致谢

你不会因为在多线程环境中不正确地使用 Core Data 而得到直接的 "error"。应用有时会崩溃。

要确认您是否正确使用它,请在您的运行时参数中打开调试标志 com.apple.CoreData.ConcurrencyDebug 1。然后每次您从错误的队列中触摸 MOC 或 MO 时它都会崩溃。

就线程而言,目前您的代码根本不正确。在一个队列上创建的 MO 只能从该队列访问。同样,为主队列配置的 MOC 必须在主队列上访问,而配置为专用队列的 MOC 必须在 ITS 专用队列上访问。

您的 "UpdateInfoQueue" 完全违反了线程规则。

打开调试标志,更正它显示的错误,您的保存问题将得到更正。