Загрузка изображений из фоновой темы с использованием блоков
У меня есть следующий метод, который в основном вызывает запрос на загрузку массива NSData изображений в фоновом потоке:
[query findObjectsInBackgroundWithBlock:^(NSArray * objects, NSError * error){
}];
В этом случае объекты представляют собой массив NSData. Проблема в том, что если у меня есть 100 изображений для загрузки (100 элементов в массиве). Это означает, что пользователю придется подождать довольно много времени, чтобы увидеть изображение, отображаемое в UITableView. Я хочу, чтобы они видели изображение, когда оно доступно/загружено. Должен ли я затем изменить код, чтобы он загружал 100 изображений в фоновом режиме?
Ответы
Ответ 1
вы можете реализовать что-то вроде этого в cellForRowAtIndexPath:
Таким образом вы загружаете каждое изображение в фоновом режиме и как только его загружается, соответствующая ячейка обновляется на mainThread.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
NSData *data0 = [NSData dataWithContentsOfURL:someURL];
UIImage *image = [UIImage imageWithData:data0];
dispatch_sync(dispatch_get_main_queue(), ^(void) {
UIImageView* imageView = (UIImageView*)[cell viewWithTag:100];
imageView.image = image;
});
});
Ответ 2
Нет, вам не нужно создавать много фоновых потоков. Используйте NSOperationQueue
.
Ответ 3
Вы можете создать NSInvocationOperation
и установить его на NSOperationQueue
например:
Инициализация NSOperationQueue
:
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
После создания NSInvocationOperation
:
NSInvocationOperation* downloadOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(selectorToDownloadImage:) object:YouData];
[operationQueue addOperation:downloadOperation];
[downloadOperation release];