当核心数据同时从后台线程和主线程中获取时,应用程序崩溃

And*_*rew 1 core-data objective-c grand-central-dispatch ios

我的情况是我的应用程序使用核心数据,并且需要从该核心数据加载图像以在表格视图中显示.由于需要花费时间,因此需要在后台线程中运行.所以我有这样的代码:

dispatch_async(queue, ^{

    if (self.cellInfo.numberOfMediaItems > 0) {

        int i = 0;

        int numberOfThumbnails = MIN(self.cellInfo.numberOfMediaItems, 3);

        while (i < numberOfThumbnails) {
            Media *media = [self.entry.media objectAtIndex:i];

            UIImage *image = [media getThumbnail];
            [self.mediaArray addObject:image];
            i++;
        }
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        self.isFinishedProcessing = YES;

        [self setNeedsDisplay];
    });

});
Run Code Online (Sandbox Code Playgroud)

这会大大加快处理速度,并且图像在准备就绪时会显示在背景中.

问题是,有时它会让前台线程尝试并与后台线程同时访问核心数据.它不喜欢这样,所以它崩溃了.这必须是许多开发人员进入的情况,因此需要一个解决方案.我想知道如何处理这种情况,以便我们的应用程序在同时开始访问核心数据时停止崩溃?

Mik*_*ler 6

在这里查看我以前的答案.

核心数据有一个黄金法则 - 每个线程一个托管对象上下文.托管对象上下文不是线程安全的,因此如果您在后台任务中工作,您可以使用主线程来避免与UI操作的线程冲突,或者创建一个新的上下文来完成工作.如果工作要采取几秒钟后你应该做后者来阻止你的UI锁定.

简而言之,您需要创建一个单独的托管对象上下文,以便在后台线程中使用.然后,您必须在适当的情况下将更改合并回原始上下文.