首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >大中央调度和并发问题

大中央调度和并发问题
EN

Stack Overflow用户
提问于 2012-07-30 16:38:59
回答 7查看 1.3K关注 0票数 1

我有一个带有图像的表视图,该图像正在使用grand中央调度懒惰地加载。我使用了一个异步队列,里面有两个串行队列,第一个用于下载图像,第二个队列用于将图像设置到单元。此方法在滚动时似乎有滞后行为。

代码语言:javascript
运行
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        __block UIImage *image = nil;
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:artist.imImage]]];
        });
        dispatch_sync(dispatch_get_main_queue(), ^{
            cell.artistImage.image = image;

        });

    });

然后我尝试用一个异步队列来下载图像,然后在里面获取主队列并设置图像。就连我也觉得这个方法不太合适。我想我在这里漏掉了什么。

代码语言:javascript
运行
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:artist.imImage]]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.artistImage.image = image;
        });

    });

我是不是遗漏了什么,或者是其他问题?

EN

Stack Overflow用户

发布于 2012-07-30 22:56:52

不幸的是,您不应该使用grand central来以这种方式更新UI。大中央调度阻塞了主线程的消息队列,即使它不应该这样做。

尝试这个来证明我的观点,使用您的异步代码,而不是使用dispatch_async,执行一个简单的消息分派,例如

代码语言:javascript
运行
复制
[self performSelector:@selector(blabla:) withObject:nil afterDelay:0]

您会发现您的代码执行得很好,但是GCD实际上是在延迟到GUI的消息循环。

如果在后台进程中使用GCD就会发生这种情况,有时会起作用,有时却不起作用。

大多数情况下,当你已经在一个GUI线程中时(如用户按下按钮操作),GCD会严重延迟GUI更新,直到它完成。

学习运行循环在iOS中是如何工作的要比把所有东西都扔给GCD要高效得多。

投球吧。

票数 1
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11717953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档