12

この AFNetworking メソッドを使用して、一度に複数のリクエストを開始します。

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
                              progressBlock:(void (^)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations))progressBlock 
                            completionBlock:(void (^)(NSArray *operations))completionBlock

それらの1つはですAFJSONRequestOperation。問題は、この JSON 操作の成功ブロックがバッチの完了ブロックの後に実行されることです。その理由はAFJSONRequestOperation、JSON 処理用の内部ディスパッチ キューがあるためです。そのため、完了ブロックが呼び出されている間、JSON データはまだ処理中です。

質問: JSON 操作の成功ブロックが呼び出された、完了ブロックでコードを実行するにはどうすればよいですか?

メイン キューにコード ブロックをディスパッチしようとしましたが、役に立ちませんでした。

4

3 に答える 3

1

可能であれば、最も簡単な解決策は、処理コードを各操作の成功ブロックからバッチ全体の完了ブロックに移動することです。

完了ブロックで利用可能です。操作を繰り返してNSArray *operations、次を探すことができます。

for(AFHTTPRequestOperation *operation in operations){
   if(operation.response.statusCode == 200){
      //Do something with the response
   }else{
     //Handle the failure
   }
}

operation.request.URLさまざまなアクションを実行する必要がある場合は、プロパティを介して各操作の URL アドレスを使用することもできます

于 2012-06-15T23:31:19.733 に答える
0

Json 操作をキューの先頭に移動し、依存関係を追加して、json 操作が終了した後にのみ別の操作を開始できるようにすることができます。

    [lastOperation addDependency:jsonOperation]
于 2013-06-27T08:08:16.373 に答える
0

OP が要求することを正確に実行する簡単な方法はないようです。そのため、簡単な回避策をいくつか示します。

かなり率直な戦略は、AFHTTPRequestOperation代わりにを使用してから、 を使用AFJSONRequestOperationして応答を変換することNSJSONSerializationです。

したがって、操作の成功ブロックは次のようになります

  success:^(AFHTTPRequestOperation *operation, id responseObject){
              NSError *error ;
              id json = [NSJSONSerialization JSONObjectWithData:responseObject 
                                            options:kNilOptions error:&error] ;
              ... 
            }

警告が適用されます - 大規模な JSON 応答の場合、これはコードをブロックする可能性があり、問題に対する AFNetworking の回避策の一部はNSJSONSerialization適用されません。しかし、これでうまくいきます。

更新:以下の最初のコメンターは、バッチ完了ブロックでそれを使用AFJSONRequestOperationして呼び出すことを提案しています。responseJSON状況が許せばそれでいい。success私の現在のユースケースでは、コードが多少複雑になります (JSON 呼び出しの混合セットを使用しているため、操作に直接関連付けられたブロックにコードを保持できれば、コードはよりクリーンになります)。

于 2013-12-02T23:14:28.877 に答える