2014-01-10 63 views
1

我有AFHTTPClient 的子類主要想法是我通過AFHTTPClient子類的單例調用所有的API,並且所有請求都經過1個點用於錯誤處理和HUD顯示。 這是切入點每個API調用:多個AFHTTPClient請求

-(void) makeRequestWithPath:(NSString*) path andParams:(NSDictionary*) params 
        success:(void (^)(id JSON, AFHTTPRequestOperation *operation)) success 
        failure:(void (^)(NSError *error)) failure 

而對於API調用類似的東西我已經得到了很多方法:

-(void) getListMainTreeWithSuccess:(void (^)(id JSON, AFHTTPRequestOperation *operation)) success 
         failure:(void (^)(NSError *error)) failure 
{ 

[self makeRequestWithPath:@"objects/selectlist" andParams:nil success:^(id JSON, AFHTTPRequestOperation *operation) { 
    success(JSON,operation); 
} failure:^(NSError *error) { 
    failure(error); 
}]; 

} 

這只是正常的我的需要。但我面對的問題,我需要通過我的AFHTTPClient子類來使閉環串請求,並作出一些行動時,所有的人都完了,我發現方法

-(void)enqueueBatchOfHTTPRequestOperationsWithRequests:(NSArray *)urlRequests 
             progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock 
            completionBlock:(void (^)(NSArray *operations))completionBlock 

應該解決我的問題,但問題是,我通過AFHTTPClient調用所有方法,它的方法是getPath:和postPath:以前的方式迫使我重寫所有內容,並使我的子類完全無用,因爲我需要添加NSArray ,這是不可能從我的子類構造或提取的,我的方法。以前我試圖用__block來同步信號量和別的東西,但是我沒有得到我需要的東西,請幫助我!

UPDATE: 這似乎是不可能的,即使使用enqueueBatchOfHTTPRequestOperations方法(甚至重寫我的代碼),因爲這種方法需要的HTTP請求操作的陣列,但它不可能構造POST請求與他們。

+0

你可以用'enqueueBatchOfHTTPRequestOperations' –

回答

0

我用遞增/遞減懸掛下載系統解決了這個問題,並將HUD與此綁定。

[networkStatus beginNetworkActivity]; 
[client someRESTActionWithCompletion:^(id object, NSError *error) { 
    [networkStatus endNetworkActivity]; 

    if (error) { 
     // Handle the error ... 
    } 

    if (![networkStatus hasNetworkActivity]) { 
     // All downloads have finished 
    } 
}]; 

我保持網絡狀態對象從AFHTTPClient子分開這,但它可以內置在客戶端,如果這就是你想要的。

網絡狀態保持一個內部計數器。 -beginNetworkActivity增加計數器,如果計數器爲0,則顯示HUD。 -endNetworkActivity遞減計數器,如果計數器變爲0,則它​​撤銷HUD。 -hasNetworkActivity如果計數器大於0則返回YES

其他注意事項:我將成功和失敗的回調合併爲一個single completion callback。我將網絡狀態邏輯與客戶端保持分開,因爲有時候我會使用單身網絡狀態對象,有時我會使用創建的實例,有時我根本不會使用它。這一切都取決於更高層次邏輯的需求。

+0

謝謝你的職位回答,但我沒有顯示HUD的問題,我已經在我的AFHTTPClient的子類中實現了它。我遇到了一個問題,通過AFHTTPClient在一個地方執行很多請求,所以我知道什麼時候它們完成了,所以我可以執行更多的代碼。使用ASIHTTP很容易,因爲所有的答案都採用單一方法,並且所有請求都一個接一個地執行,所以我完全知道它們何時完成。 – KysokZla

+0

@KysokZla'[networkStatus hasNetworkActivity]'將在所有請求完成時返回NO。這是你正在尋找的指標。 –

0

再次,如@MikePollard表示,採用

[AFHHTPClient HTTPRequestOperationWithRequest:success:failure:] 

對於該方法使用create NSURLRequest(或使用其他一個,挑選哪一個是適合你)創建AFHTTPRequestOperation。在這裏,您還可以指定使用哪種方法POSTGET或任何其他方法。

[AFHTTPClient requestWithMethod: 
          path: 
        parameters:] 

之後,所有的操作保存到NSArray,並使用安排它們:

[AFHTTPClient enqueueBatchOfHTTPRequestOperationsWithRequests: 
               progressBlock: 
               completionBlock:] 

代碼示例:

NSMutableArray *ops = [NSMutableArray new]; 
NSMutableURLRequest *request1 = [[AFHTTPClient sharedClient] requestWithMethod:@"GET" 
                      path:@"MyEndpoint" 
                    parameters:@{@"key1": @"value"}]; 
AFHTTPRequestOperation *op1 = [[AFHTTPClient sharedClient] HTTPRequestOperationWithRequest:request1 
                        success:^(AFHTTPRequestOperation *operation, id responseObject) { 
                         NSLog(@"Success!"); 
                        } 
                        failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
                         NSLog(@"Failure!"); 
                        }]; 
[ops addObject:op1]; 

NSMutableURLRequest *request2 = [[AFHTTPClient sharedClient] requestWithMethod:@"POST" 
                      path:@"MyAnotherEndpoint" 
                    parameters:@{@"key2": @(104)}]; 
AFHTTPRequestOperation *op2 = [[AFHTTPClient sharedClient] HTTPRequestOperationWithRequest:request2 
                        success:^(AFHTTPRequestOperation *operation, id responseObject) { 
                         NSLog(@"Success!"); 
                        } 
                        failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
                         NSLog(@"Failure!"); 
                        }]; 
[ops addObject:op2]; 
[[AFHTTPClient sharedClient] enqueueBatchOfHTTPRequestOperationsWithRequests:ops 
                   progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
                    NSLog(@"numberOfFinishedOperations: %d totalNumberOfOperations %d", 
                     numberOfFinishedOperations, 
                     totalNumberOfOperations); 
                   } 
                  completionBlock:^(NSArray *operations) { 
                   NSLog(@"All operation compelted!"); 
                  }]; 
+0

對不起,我不明白你的答案(你可以提供一個簡單的代碼,例如,2個不同的POST請求,每個不同的參數,並執行它們與你的方法。非常感謝你的幫助 – KysokZla

+0

正是我' m沒有得到如何通過[AFHHTPClient HTTPRequestOperationWithRequest:success:failure:]保存HTTPRequestOperation對象,因爲這個對象只在成功塊中可用,並且這個塊只在操作完成時纔會出現。我在某處是否有錯? – KysokZla

+0

是的,但是無論如何,我已經添加了一個例子,我希望現在你能理解這個想法。 – Vytautas