私のシーンはこのようなものです。まず、特定のページのデータを返すサーバーJSON APIがあります.APIは/data/page/1
のようです。AFNetworkingを並列リクエストで使用してすべての結果を収集する方法
page 1 => ['a','b']
page 2 => ['c','d']
page 3 => ['e','f']
単一ページのデータは、それがうまく機能要求のために、私は、APIからデータを取得するためにAFNetworking 2を使用します。この場合、応答データがあるとします。
問題は今では複数のページに対して並列リクエストを実装したいと考えています。 1つのページ番号を受け入れるView Controllerには1つのAPIが必要で、これらのページのすべてのデータを収集したコールバックが必要です。私が必要APIである:
typedef void (^DataBlock)(id data);
- (void) dataForPages:(NSInteger)pages withSuccessBlock:(DataBlock)block;
pages
パラメータのビューコントローラパス3
場合、私はAFNetworkingは、データ並列を要求し、次いで、コールバックブロックで使用3の結果を収集することができたいです。
私はマルチAFHTTPRequestOperation
を処理するためにNSOperationQueue
を使用しようとしたが失敗し、コードのデモは、このようなものです:私のテストで
- (void) dataForPages:(NSInteger)pages withSuccessBlock:(DataBlock)block
{
//want to use for each, here suppose pages is 3
NSMutableArray *result = [[NSMutableArray alloc] init];
AFHTTPRequestOperation *op1 = [[AFHTTPRequestOperation alloc] initWithRequest:@"/data/page/1"];
AFHTTPRequestOperation *op2 = [[AFHTTPRequestOperation alloc] initWithRequest:@"/data/page/2"];
AFHTTPRequestOperation *op3 = [[AFHTTPRequestOperation alloc] initWithRequest:@"/data/page/3"];
[op1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[result addObjectsFromArray: responseObject]; //responseObject is ['a', 'b']
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
[op2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[result addObjectsFromArray: responseObject]; //responseObject is ['c', 'd']
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
[op3 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[result addObjectsFromArray: responseObject]; //responseObject is ['e', 'f']
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
NSOperationQueue *q = [[NSOperationQueue alloc] init];
[q addOperation:op1];
[q addOperation:op2];
[q addOperation:op3];
[q waitUntilAllOperationsAreFinished];
block(result);
}
結果常に空、私はかなりwaitUntilAllOperationsAreFinished
を理解していませんよ。
誰でもこの問題をNSOperation
またはGCD
とどのように扱うかを知っていますか?