开始学习核心数据和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。
发布于 2012-10-02 23:28:51
dispatch_get_global_queue (Swift中的DispatchQueue.global())为您提供了一个后台队列,您可以在该队列上分派异步运行的后台任务(即不会阻塞您的用户界面)。如果您最终将多个块提交到全局队列,则这些作业可以并发操作。如果您希望将多个代码块提交到后台队列,而这些代码块必须在后台顺序运行(通常不需要),则可以创建自己的串行后台队列并将其分派到该队列,但如果并发后台操作是可接受的,则使用dispatch_get_global_queue是方便/高效的。
不过,请注意,您不允许在后台队列中执行用户界面更新,因此,一旦主队列可用,dispatch_get_main_queue的dispatch_async (即Swift中的DispatchQueue.main.async { ... } )就会让后台队列将用户界面更新分派回主队列。
这是一个非常常见的编程模式:提交一些东西在后台运行,当它需要执行用户更新时,将更新分派回主队列。
有关详细信息,请参阅Concurrency Programming Guide。
发布于 2012-10-02 23:25:59
只要您想要操作UI元素,就应该使用dispatch_get_main_queue。这与线程亲和性有关,这是一种常见的UI框架模型。线程关联意味着您只能在创建该对象的线程上操作该对象。对于Cocoa Touch中的UI类,这是主线程。这是所有重要平台上的UI框架的典型习惯用法。
因此,dispatch_get_main_queue获取与主线程相关联的队列。如果不这样做,当您的UI在不同的线程上更新时,会发生奇怪的事情。我通常在UI冻结的地方看到长时间的停顿。
dispatch_get_global_queue获取与你的应用程序相关联的给定优先级的任何旧队列。非常适合网络呼叫,或者像您的情况一样,使用核心数据。
发布于 2012-10-02 23:19:11
全局队列为您提供了一个不同于主que的队列,但省去了实际创建自己的队列的麻烦。当你需要你的代码在主队列上工作时使用get_main_queue (所有的UI工作都需要在主队列上进行)
https://stackoverflow.com/questions/12693197
复制相似问题