我的場景是這樣的,首先我有一個服務器json api,它返回指定頁面的一些數據,api就像/data/page/1
。對於這種情況,假設響應數據是:如何使用AFNetworking並行請求並收集所有結果
page 1 => ['a','b']
page 2 => ['c','d']
page 3 => ['e','f']
我用AFNetworking 2從API獲取數據,對於單頁數據請求它工作得很好。
現在的問題是我想實現多個頁面的並行請求。我需要一個視圖控制器API來接受一個頁碼,並回收這些頁面收集的所有數據。我需要的API是:
typedef void (^DataBlock)(id data);
- (void) dataForPages:(NSInteger)pages withSuccessBlock:(DataBlock)block;
如果視圖控制器通3
爲pages
參數,我想AFNetworking可以請求數據並行,然後收集隨後的3結果在回調塊使用。
我試圖用NSOperationQueue
處理多AFHTTPRequestOperation
但失敗了,代碼演示是這樣的:
- (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
?