开始了解核心数据和dispatch_async。有一段代码可以从数据集中获取图像的url并将其设置为核心数据模型,如下所示
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
dispatch_async(dispatch_get_main_queue(), ^{
[photoModel setValue:imageData forKey:@"photoImageData"];
有人可以向我解释为什么我们使用dispatch_get_global_queue
作为外部dispatch_async而使用dispatch_get_main_queue
作为内部dispatch_async。
答案 0 :(得分:84)
dispatch_get_global_queue
会为您提供一个后台队列,您可以在其上调度异步运行的后台任务(即不会阻止您的用户界面)。如果您最终向全局队列提交多个块,则这些作业可以同时运行。如果您有多个代码块要提交到后台必须在后台运行的后台队列(通常不需要),您可以创建自己的串行后台队列并调度到该队列,但是如果并发后台操作是可以接受,然后利用dispatch_get_global_queue
方便/高效。
请注意,您不允许在后台队列中执行用户界面更新,因此dispatch_async
dispatch_get_main_queue
允许后台队列将用户界面更新重新发送回主队列,一旦主队列可用。
这是一种非常常见的编程模式:提交在后台运行的内容以及何时需要执行用户更新,将更新分发回主队列。
有关详细信息,请参阅Concurrency Programming Guide。
答案 1 :(得分:14)
每当您想要操纵UI元素时,都应该使用dispatch_get_main_queue
。这与线程关联性有关,线程关联性是UI框架的通用模型。线程关联意味着您只能操作创建该对象的线程上的对象。对于Cocoa Touch中的UI类,这是主线程。这是所有重要平台上的UI框架的典型习惯。
因此dispatch_get_main_queue
获取与主线程关联的队列。当你的UI在不同的线程上更新时,不这样做会导致奇怪的事情发生。我通常会看到UI暂停的长时间停顿。
dispatch_get_global_queue
获取与您的应用相关联的给定优先级的任何旧队列。非常适合网络呼叫,或者像在您的情况下使用Core Data一样。
答案 2 :(得分:9)
全局队列为您提供了除主要que之外的队列,但为您节省了实际创建自己的队列的麻烦。当您需要代码在主队列上工作时(需要执行所有UI工作),请使用get_main_queue
答案 3 :(得分:2)
npm install bson@1.0.3
答案 4 :(得分:0)
简而言之,dispatch_get_global_queue
用于执行后台任务。但是当你在后台执行任何任务,然后如果你需要执行任何与user interface
相关的任务时,你需要在dispatch_get_main_queue()