0

AFNetworking の完了ブロックに問題があります。私のアプリは車に関する json データを取得し、この json ファイルから id を使用して、すべての車を uitableview に表示する前に別の API に画像を取得するように要求する必要があります。ただし、情報を取得する前に uitableview reload が常に呼び出されるため、空のテーブルが表示されます。

私はModel.mを持っています typedef void (^CompletionBlock)(NSArray *results);

-(void)getPhotosWithCompletionBlock: (CompletionBlock)completionBlock failureBlock: (FailureBlock)failureBlock{
    NSURLRequest *request = [NSURLRequest alloc] initWithURL:[NSURL alloc] initWithString:
                            [NSString stringWithFormat:@"api.getPhoto"]]];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        completionBlock(JSON);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        failureBlock(JSON);
    }];
    [operation start];
}

ModelViewController.m

- (void)getAllModels{
   NSURLRequest *request = ...;
   AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
     for(NSDictionary *model in JSON){
        Model *model = [Model alloc] initWithId:...;
        [model getPhotosWithCompletionBlock: ^(NSArray *results){
            model.photos = results;
         }failureBlock:^(NSError *error) {
                NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
            }];
      }
      [_tableView reloadData];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];

[operation start];

しかし、[_tableView reload] は常に getPhotos メソッドの completionBlock が終了する前に呼び出されるため、空の tableView が存在するため、reload tableView メソッドを呼び出す前に完了ブロックを終了させるにはどうすればよいですか? 完了ブロック内にリロード メソッドを配置できますが、tableView のリロードが何度も強制され、アプリが非常に応答しなくなります。モデル情報を取得するメソッドがもう 1 つあるため、すべての完了ブロック内にリロード メソッドを配置することはできません。P/S: ネストされた afnetworking 操作を使用せずに私の状況について何か考えはありますか?

4

1 に答える 1