Я новичок в программировании 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];
}
}