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)
这会大大加快处理速度,并且图像在准备就绪时会显示在背景中.
问题是,有时它会让前台线程尝试并与后台线程同时访问核心数据.它不喜欢这样,所以它崩溃了.这必须是许多开发人员进入的情况,因此需要一个解决方案.我想知道如何处理这种情况,以便我们的应用程序在同时开始访问核心数据时停止崩溃?
核心数据有一个黄金法则 - 每个线程一个托管对象上下文.托管对象上下文不是线程安全的,因此如果您在后台任务中工作,您可以使用主线程来避免与UI操作的线程冲突,或者创建一个新的上下文来完成工作.如果工作要采取几秒钟后你应该做后者来阻止你的UI锁定.
简而言之,您需要创建一个单独的托管对象上下文,以便在后台线程中使用.然后,您必须在适当的情况下将更改合并回原始上下文.
| 归档时间: |
|
| 查看次数: |
1494 次 |
| 最近记录: |