我是GCD和新手,并且正在缓解这一问题。GCD - 用于更新UIImageView的主要vs后台线程
背景:我正在为使用ALAssetsLibrary的UIScrollView的延迟加载例程工作。当我的UIScrollView加载时,我使用我的ALAssets的aspectRatioThumbnails
填充它,然后在用户滚动时,我调用以下例程以加载当前正在显示的ALAsset的fullScreenImage
。它似乎工作。
(如果任何人有更好的延迟加载程序请发表评论。我看了所有我能找到加上WWDC的视频,但他们似乎与平铺处理更多或有更多的复杂性比我更需要)
我的问题:我使用一个后台线程来处理加载fullScreenImage
,当做到这一点我用的是主线程,将其应用到UIImageView的。 我是否需要使用主线程?我已经看到所有UIKit更新都需要在主线程上发生,但我不确定这是否适用于UIImageView。我以为它确实如此,因为它是一个屏幕元素,但后来我意识到我根本不知道。
- (void)loadFullSizeImageByIndex:(int)index
{
int arrayIndex = index;
int tagNumber = index+1;
ALAsset *asset = [self.assetsArray objectAtIndex:arrayIndex];
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *tmpImage = [[UIImage alloc] initWithCGImage:asset.defaultRepresentation.fullScreenImage];
if ([weakSelf.scrollView viewWithTag:tagNumber] != nil){
dispatch_async(dispatch_get_main_queue(), ^{
if ([weakSelf.scrollView viewWithTag:tagNumber]!= nil){
UIImageView * tmpImageView = (UIImageView*)[weakSelf.scrollView viewWithTag:tagNumber];
tmpImageView.image = tmpImage;
}
});
}
});
}
是它在渲染图像,当你把在后台线程点检查强为非零? – iDev
@ACB:刚做了一个测试 - 是的,它的渲染速度比从主线程调用慢5倍左右(如我的示例代码所示)。 –
但是按照UIView文档,你应该在主线程中使用它。我在答复中从文档中发布了该部分。 – iDev