gpt4 book ai didi

objective-c - 大中央调度和并发问题

转载 作者:行者123 更新时间:2023-12-01 17:33:39 25 4
gpt4 key购买 nike

我有一个表格 View ,其中包含使用大型中央调度延迟加载的图像。我使用了一个异步队列,里面有两个串行队列,第一个用于下载图像,第二个队列用于将图像设置到单元格。这种方法在滚动时似乎有滞后行为。

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;
});

});

是我在这里遗漏了什么还是其他问题?

最佳答案

UIKit 不是线程安全的,因此您应该将所有 UIKit 操作排队到主队列。目前尚不清楚使用第二种解决方案会遇到什么样的问题:

    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:artist.imImage]]];
dispatch_async(dispatch_get_main_queue(), ^{
cell.artistImage.image = image;
});

但我建议在主线程中实例化 UIImage:
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:artist.imImage]];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:data];
cell.artistImage.image = image;
});

关于objective-c - 大中央调度和并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717953/

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