Я новичок в GCD и блокирую, и я прокладываю себе путь.
Фон: Я работаю над ленивой программой загрузки для UIScrollView, используя ALAssetsLibrary. Когда мои загрузки UIScrollView заполняют его с помощью aspectRatioThumbnails
моих ALAssets, а затем, когда пользователь прокручивает, я вызываю подпрограмму ниже, чтобы загрузить 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;
}
});
}
});
}