gpt4 book ai didi

objective-c - dispatch_get_global_queue vs dispatch_get_main_queue

转载 作者:IT老高 更新时间:2023-10-28 11:42:29 26 4
gpt4 key购买 nike

开始学习核心数据和 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。

最佳答案

dispatch_get_global_queue(在 Swift 中为 DispatchQueue.global())为您提供一个后台队列,您可以在该队列上调度异步运行的后台任务(即不会阻塞您的用户界面)。如果您最终将多个 block 提交到全局队列,这些作业可以同时运行。如果您有多个代码块要提交到必须在后台按顺序运行的后台队列(不经常需要),您可以创建自己的串行后台队列并分派(dispatch)到该队列,但如果并发后台操作是可以接受,然后利用 dispatch_get_global_queue 方便/高效。

但请注意,您不能在后台队列中执行用户界面更新,因此 dispatch_asyncdispatch_get_main_queue(即 DispatchQueue .main.async { ... } in Swift)让后台队列在主队列可用后将用户界面更新分派(dispatch)回主队列。

这是一种非常常见的编程模式:提交一些东西在后台运行,当它需要执行用户更新时,将更新分派(dispatch)回主队列。

有关详细信息,请参阅 Concurrency Programming Guide .

关于objective-c - dispatch_get_global_queue vs dispatch_get_main_queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12693197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com