私はGCDとブロックが初めてで、それに慣れています。
背景: ALAssetsLibrary を使用して、UIScrollView の遅延読み込みルーチンに取り組んでいます。UIScrollView が読み込まれるとaspectRatioThumbnails
、ALAsset が読み込まれ、ユーザーがスクロールすると、以下のルーチンを呼び出して、fullScreenImage
現在表示されている ALAsset を読み込みます。うまくいくようです。
(誰かがより良い遅延読み込みルーチンを持っている場合は、コメントを投稿してください。私が見つけることができるすべてと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;
}
});
}
});
}