2013-05-30 99 views
1

我正在使用AFNetworkingAFHTTPClient類來與Rails後端進行通信。檢測一個方法是否從一個塊被調用

當創建對象時,我想使用批API在服務器上運行幾個API調用(如果您想知道,我使用的是batch_api)。

很好地擴展AFHTTPClient我想有一個API,它應該是這樣的:

[[[SPRRailsClient] sharedInstance] batchOperations:^ { 
    NSMutableURLRequest *request = [[SPRRailsAPIClient sharedClient] 
        requestWithMethod:@"GET"                          
           path:myPath 
         parameters:parameters]; 
    AFHTTPRequestOperation *operation = [[SPRRailsAPIClient sharedClient] 
          HTTPRequestOperationWithRequest:request 
                success:nil 
                failure:nil]; 

}]; 

訣竅將覆蓋SPRRailsClient(我AFHTTPClient子類),所以當requestWithMethod:path:parameters:HTTPRequestOperationWithMethod:success:failure:是一個batchOperations內調用如果行爲以不同的方式(排隊的東西,或重新運行AFOperation的不同子類)

這個設計的整潔的事情是,它可以讓我保留現有的代碼,只能包裝它的智慧爲了使某些調用在「批處理模式」下執行,請禁止該塊。

我的問題是:如何檢測一個方法是從一個塊中調用的?我需要requestWithMethod:path:parameters:檢測到,並且:

  1. 如果從batchOperations塊調用,表現方式不同。
  2. 如果不是從batchOperations塊中調用,只需撥打super即可。

我知道只要在SPRRailsClient上添加兩個附加方法會更簡單,但我認爲這看起來更好。

而且,我想這是可能的,因爲UIView動畫一些方法從動畫塊中調用時不同的行爲方式,並NSManangedObjectContextperformBlock:可能是做類似的事情爲好。

回答

1

我能想到的唯一方法是將batchOpperations塊排入指定隊列,然後在執行塊時檢查隊列名稱。這看起來像這樣:

在您的.m文件或​​您的方法的頂部,要麼工作。

static dispatch_queue_t myQueue; 

然後batchOpperations內,

if (!myQueue){ 
myQueue = dispatch_queue_create("com.mydomain.myapp.myqueue", NULL); 
} 

dispatch_async(myQueue, batchOpperation); 

然後,當被稱爲你的sharedClient方法中,檢查隊列:

if ([[NSString stringWithCString:dispatch_queue_get_label(dispatch_get_current_queue()) encoding:NSUTF8StringEncoding] isEqualToString:@"com..."]){ 
    something.... 
} 
else{ 
    [super ??]; 
} 
+0

好主意!也許我想要做的是過度殺傷... – pgb

相關問題