2016-07-07 4 views
0

私のシーンはこのようなものです。まず、特定のページのデータを返すサーバー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とどのように扱うかを知っていますか?

答えて

0

コード調査の結果、NSOperationNSOperationQueueで私が望むものを得るのが難しいことがわかりました。なぜなら、AFNetworkingには自分自身のcompletion block handlerがあるからです。

最終溶液が使用dispatch_groupで、すべてのコードは次のようである:

dispatch_group_t group = dispatch_group_create(); 


NSURLRequest *req1 = ...; 
NSURLRequest *req2 = ...; 

AFHTTPRequestOperation *op1 = [[AFHTTPRequestOperation alloc] initWithRequest:req1]; 
AFHTTPRequestOperation *op2 = [[AFHTTPRequestOperation alloc] initWithRequest:req2]; 

NSMutableArray *result = [[NSMutableArray alloc] init]; 

dispatch_group_enter(group);  //enter group 

[op1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    [result addObjectsFromArray: responseObject]; 
    dispatch_group_leave(group);  //leave group in completion handler 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    dispatch_group_leave(group); 
}]; 

dispatch_group_enter(group); 
[op2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    [result addObjectsFromArray: responseObject]; 
    dispatch_group_leave(group); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    dispatch_group_leave(group); 
}]; 

[op1 start]; 
[op2 start]; 

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    block(result); 
}); 
関連する問題