我是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