Ios 使用app'在核心数据中保存图像;s默认全局队列导致冻结?
我正在开发一个应用程序,该应用程序可以从facebook获取图像。我正在使用核心数据来保存图像。我使用Ios 使用app'在核心数据中保存图像;s默认全局队列导致冻结?,ios,objective-c,core-data,grand-central-dispatch,dispatch-async,Ios,Objective C,Core Data,Grand Central Dispatch,Dispatch Async,我正在开发一个应用程序,该应用程序可以从facebook获取图像。我正在使用核心数据来保存图像。我使用dispatch\u asyc功能将图像保存在核心数据中。我用 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) 保存图像以便我的主线程不会阻塞 但有时我观察到应用程序冻结,没有响应。我使用同样的方法将图像保存到应用程序中不同位置的核心数据中,比如如果用户转到已签名的用户配置文件,则应
dispatch\u asyc
功能将图像保存在核心数据中。我用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
保存图像以便我的主线程不会阻塞
但有时我观察到应用程序冻结,没有响应。我使用同样的方法将图像保存到应用程序中不同位置的核心数据中,比如如果用户转到已签名的用户配置文件,则应用程序将以同样的方式保存他的相册照片。此外,如果用户进入任何图像的全屏,它将开始以相同的方式获取评论、喜欢和保存
若我使用一个私有队列并使用它进行保存,那个么应用程序不会冻结
由于我在应用程序中的许多地方使用全局队列,这是应用程序冻结的原因吗
谢谢。您确实应该阅读《核心数据编程指南》中有关并发性的部分。听起来您正在访问创建managedObjectContext的线程之外的managedObjectContext,这是非法的。您最好使用带有performBlock的子上下文来执行此任务。大概是这样的:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:parentContext];
[context performBlock:^{
//Save image
}];
这个问题已经解决了。问题是多线程访问主上下文,因此应用程序将进入冻结状态。现在这个问题已经解决。不,我没有访问不同线程的上下文。是否与全局并发队列有关?您是否在该全局队列上创建NSManagedObjectContext的实例,并且仅从该并发队列中引用属于该实例的对象?是的,我的所有上下文都是使用相同的全局队列创建的。这是CEarwood的回答