0

私はiOSプログラミングの初心者です。だから私は初心者の質問があります。私はAFNetworking 2を使い始めています。それがタスクです:

お願いがあります。その応答は、2 番目の要求の一部です。これは、最初のリクエストが終了するまで待たなければならないことを意味します。彼らは段階的に従います。2 番目の応答を取得したら、それを解析し、20 個の URL をhttp://lalala-xx.jpgの形式で保存します。その後、画像を読み込んでUICollectionViewに入れたいのですが、すべてをスコープ内ではなく、「ダウンロード->セルに直接」というスキームで実行したいと考えています。URL と画像をシングルトン クラスに保存し、同じようにそれらにアクセスします。

- (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];
}

2 番目の方法:

- (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 が何らかの操作キューを提供してくれると思います。
そして、私は今自分のコードが好きではありません。私はこのチェーンを使用していますが、imgURL を返す独立した method2 が必要です。ユーザーがボタンを押す -> メソッド 1 -> メソッド 2 -> 停止。ユーザーがボタンを押すまで待ち​​ます -> image1 をダウンロードします -> image1 を表示します -> image2 をダウンロードします -> image2 を表示します -> など -> imageN をダウンロードします -> imageN を表示します -> 停止します。繰り返しますが、画像を配列に保存する必要があります。その後で使用します。ありがとうございます。

///////////////////////////////////// アップデート //////////// /////////////////////////

解決策を見つけました。しかし、それは私を完全に満足させるものではありません。画像はランダムに来ます。それらを順番にロードする方法は?

- (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];
    }
}
4

1 に答える 1