Загрузка изображений из фоновой темы с использованием блоков

У меня есть следующий метод, который в основном вызывает запрос на загрузку массива 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];