2014-01-15 91 views
1

我使用下面的代碼來啓動N個請求,其中每個請求都是由兩個必須手持的請求組成的(我不關心阻止UI,因爲我希望應用程序被阻止):restkit中的操作順序

objectManager.operationQueue.maxConcurrentOperationCount = 1; 

for (int i = 0; i< n; i++) 
{ 
[objectManager postObject:reqObj 
         path:@"sync.json" 
        parameters:nil 
         success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
         [operation waitUntilFinished]; 
         // Do something and then send the second request 
         [self sendAck]; 
      } // end success 
        failure:^(RKObjectRequestOperation *operation, NSError *error) {} 
]; 

} 

而第二個要求是非常相似:

-(void)sendAck 
    { 
    [objectManager postObject:reqObj 
          path:@"sync.json" 
         parameters:nil 
          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
           [operation waitUntilFinished]; 

    } 
    failure:^(RKObjectRequestOperation *operation, NSError *error) {} 
    ] 

    } 

但在檢查服務器的日誌後,我意識到,所有的「ACK的」,我的意思是所有的第二請求來畢竟第一次請求。結果顯然不正確。 如果請求i已啓動,那麼在發送i + 1請求之前,我們必須等待第二個請求完成。那就是:

req. i, second req. on i, req. i+1, second req. on i+ 1,... 

,而不是

req .i ,req. i+1, ....., second req. on i, second req. on i+1 

使用操作隊列是錯誤還是我失去了一些東西?

+0

_「我不在乎阻止用戶界面,因爲我想阻止應用程序」_用戶不會 - 蘋果可能會拒絕它。 – CouchDeveloper

+0

'[operation waitUntilFinished]'可能沒有效果,因爲當完成處理程序將被執行時,操作總是完成。我想念什麼? – CouchDeveloper

+0

該操作是一個同步過程,不能被阻止。 – giuseppe

回答

0

我從來沒有嘗試過這種方法,但確保您按特定順序調用請求的一種好方法是將它們放入隊列中,如here所述。

另一種方法是使呼叫同步,一個很好的方法來描述here

+0

第一個鏈接與我的代碼完全相同,如果你檢查了什麼postObject你會注意到它排隊請求,就像在文檔中一樣。 – giuseppe

0

使用「遞歸」,即消除了環路,並使用全球variabile的,其對總的請求數是一個更好的辦法,因爲在這個答案of SO

0

這樣做的原因行爲,你如何使用`NSOperationQueue:

在for循環中,您實際上是enqueueing N「發送」請求。所有按順序和順序執行。

當第一個請求完成時,下一個「發送」請求將被執行。由於第一個「發送」請求已完成,你入隊對應的「sendAck」。也就是說,將附加到到隊列尾部,其他「發送」請求仍在等待。

當第二個「發送」請求完成時,下一個「發送」請求將被執行,依此類推。由於第二次「發送」請求已經完成,你入隊對應的「sendAck」等強制。

當所有「發送」請求都被執行完畢,第一個「sendAck」請求被髮送。完成後,將執行下一個「sendAck」,並強制執行,直到所有「sendAck」請求最終發送完畢。

+0

而哪個解決方案可以獲得我想要的? – giuseppe

+0

@giuseppe首先,不要運行for循環。相反,將請求(或URL和params)作爲對象放入NSMutableArray。啓動第一個請求並從陣列中刪除它。在完成處理程序中,從數組中刪除第一個(現在是第二個),並從第一個請求開始該請求和相應的確認。這看起來像一個遞歸,但事實上並非如此。 – CouchDeveloper

+0

好的,我會試試。 – giuseppe