Загрузка изображений в UICollectionView через AFNetworking

Я новичок в программировании iOS. Итак, у меня вопрос новичка. Я начинаю работу с AFNetworking 2, и это задача:

У меня есть просьба. Его ответ является частью второго запроса. Это означает, что я должен дождаться окончания первого запроса. Они следуют шаг за шагом. Когда я получаю второй ответ, я анализирую его и сохраняю 20 URL-адресов в формате http://lalala-xx.jpg. После этого я хочу загрузить изображения и поместить их в UICollectionView, и я хочу сделать это не все в области видимости, а по схеме "загрузил->прямо в ячейку". Я сохраняю URL-адреса и изображения в классе singleton и получаю к ним доступ так же, как

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.imageView.image = [[UserData sharedUser].images objectAtIndex:indexPath.row];
    return cell;
}

Цепочка метосов выглядит так

- (void)method1
{
    NSString     *string  = [NSString stringWithFormat:firstRequestString];
    NSURL        *url     = [NSURL URLWithString:string];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         // getting needed part for second request
         [self method2:(NSString *)part1];
     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
         // show error
     }];

    [operation start];
}

Второй метод:

- (void)method2:(NSString *)part1
{
    // lalala making secondRequestString
    NSString     *string  = [NSString stringWithFormat:secondRequestString];
    NSURL        *url     = [NSURL URLWithString:string];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         NSMutableArray *imageURLs = [[NSMutableArray alloc] init];
         // getting needed URLs 
         [self loadAllImages:(NSMutableArray *)imageURLs];
     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
         // show error
     }];

    [operation start];
}

Последний:

- (void)loadAllImages:(NSMutableArray *)imageURLs
{
    // ???
}

Я застрял. Что я должен делать дальше? У меня есть 20 URL-адресов, но как мне загрузить изображения и направить их в ViewController для обновления изображения в ячейках? Я полагаю, AFNetworkig может предоставить мне очередь операций.
И мне не нравится мой код сейчас. Я использую эту цепочку, но мне нужен независимый метод2, возвращающий imgURL. Так должно выглядеть: Пользователь нажимает кнопку -> метод1 -> метод2 -> стоп. Подождите, пока пользователь не нажмет кнопку -> загрузить изображение 1 -> показать изображение 1 -> загрузить изображение 2 -> показать изображение 2 -> и так далее -> загрузить изображение N -> показать изображение N -> остановить. Я повторюсь, мне нужно хранить изображения в массиве, я буду использовать его после этого. Спасибо, ты прочитал это.

///////////////////////////////////// ОБНОВИТЬ //////////// //////////////////////////

Я нашел решение. Но это не удовлетворяет меня полностью. Изображения приходят случайным образом. Как заставить их загружаться по порядку?

- (void)loadAllImages:(NSMutableArray *)imageURLs
{        
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    for (NSURL *url in imageURLs)
    {
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.responseSerializer = [AFImageResponseSerializer serializer];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
         {
             [[UserData sharedUser].images addObject:responseObject];
             [[NSNotificationCenter defaultCenter] postNotificationName:@"CollectionViewRealoadData" object:nil];
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error)
         {
             // show error
         }];

        [manager.operationQueue addOperation:operation];
    }
}

person Asd Asdf    schedule 23.12.2014    source источник


Ответы (1)


Вам нужно получить данные из URL-адресов, а затем создать объект UIImage из этих данных.

Вы можете получить данные из URL-адреса, используя методы NSURL.

 for(NSString *imgString in imageURLs){
     NSURL *url = [NSURL URLWithString:imgString];
     NSData *imgData = [NSData dataWithContentsOfURL:url];
     UIImage *img = [UIImage imageWithData:imgData ];

     [imageUrls addObject:img];//this mutable array should be initialized early in view controller life cycle (like ViewDidLoad). 
  }

Когда у вас есть объект изображения, вы можете добавить его в свой массив изображений, который вы используете в качестве источника данных для представления коллекции.

   [_collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:[imageUrls count] - 1 inSection:0]]];

// перезагрузить представление коллекции после добавления новых данных

person JoshR604    schedule 23.12.2014
comment
Я предположил, что [_collectionView insertItemsAtIndexPaths:arrayWithIndexPaths]; лучше, чем [_collectionView reloadData]; - person Asd Asdf; 23.12.2014
comment
Да, это будет более эффективно, особенно если ваш набор изображений будет расти - я отредактировал свой ответ. - person JoshR604; 24.12.2014