2016-07-07 74 views
0

我的場景是這樣的,首先我有一個服務器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; 

如果視圖控制器通3pages參數,我想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

任何人都知道如何處理這個問題NSOperationGCD

回答

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); 
}); 
相關問題