我有一个带有图像的表视图,该图像正在使用grand中央调度懒惰地加载。我使用了一个异步队列,里面有两个串行队列,第一个用于下载图像,第二个队列用于将图像设置到单元。此方法在滚动时似乎有滞后行为。
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;
});
});然后我尝试用一个异步队列来下载图像,然后在里面获取主队列并设置图像。就连我也觉得这个方法不太合适。我想我在这里漏掉了什么。
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;
});
});我是不是遗漏了什么,或者是其他问题?
发布于 2012-07-30 22:56:52
不幸的是,您不应该使用grand central来以这种方式更新UI。大中央调度阻塞了主线程的消息队列,即使它不应该这样做。
尝试这个来证明我的观点,使用您的异步代码,而不是使用dispatch_async,执行一个简单的消息分派,例如
[self performSelector:@selector(blabla:) withObject:nil afterDelay:0]您会发现您的代码执行得很好,但是GCD实际上是在延迟到GUI的消息循环。
如果在后台进程中使用GCD就会发生这种情况,有时会起作用,有时却不起作用。
大多数情况下,当你已经在一个GUI线程中时(如用户按下按钮操作),GCD会严重延迟GUI更新,直到它完成。
学习运行循环在iOS中是如何工作的要比把所有东西都扔给GCD要高效得多。
投球吧。
https://stackoverflow.com/questions/11717953
复制相似问题