2013-10-11 71 views
0

在for循環中執行批處理的最佳方法是什麼?所有apis今天都有可以提取的最大數量的項目。 例如,一批100條推文。在這種情況下,如果我有一個我想要查詢信息的1001個ID的列表,那麼我需要撥打11個呼叫,每批100個ID。我會使用一個for循環來調用任務,一旦一批100人形成,就會調用任務中的條件。 有沒有更好的方法來做到這一點? 鑑於這是一種常見模式,不應該有語言中的內置構造來處理這個問題嗎?我錯過了什麼嗎?成批循環

+1

一個'for'環能做到這一點,是的。有什麼問題? –

+0

爲什麼您認爲Objective-C(或其他語言)應該在語言中使用特殊的構造,僅僅是因爲某些第三方Web API對於一次可以提出的請求數量有限制? – rmaddy

回答

0

我結合了while和for循環

int totalItems = 1001; 
    int batchSize = 100; 
    int i = 0; 

    while (i < totalItems){ 
     [self fetchABatch:(totalItems-i)]; 
     i += batchSize; 
    } 


    -(void)fetchABatch:(int) count 
    { 
      if (count > batchSize){ 
       // fetch full batch 
      }else{ 
       batchSize = count; 
       // fetch a partial batch 
      } 
    } 
+1

'for'循環在哪裏? – rmaddy

+0

對不起,我在一段時間內開始了一個for循環,並決定用不同的方法來填充它。如果你從網上提取數據,它可能會有很多代碼。這將使其更具可讀性。 –

+0

是的,但現在看起來像一個普通的模式,只需要像批處理的東西,你指定批量大小作爲參數之一,而不是做一個模組等。 – okokokok

0

如果API限制你100條記錄的時間,然後是你將需要11名的請求,周圍有沒有得到。

我可能會創建一個NSOperation封裝爲每個頁面的請求,創建(在本例中11),一個你需要的所有頁面,然後拖放到一個NSOperationQueue,因爲每個操作完成,你可以把他們的成果,將它們放入內存中的一個統一數組中,或者將它們寫入Core Data。

0

你的問題不清楚。但是,如果你想要做的事在for循環中每100次只是做 如果(I%100 == 0){// 做我的事 }

1

在Objective-C,你可以建立自己的額外的結構如果你想要一個:

@interface NSArray (OKBatchedSubarrays) 

// this will return an array of subarrays, with each of those 
// containing no more items than batchSize, and the order of input 
// objects being preserved 
- (NSArray *)subarraysWithBatchSize:(NSUInteger)batchSize; 

@end 

... 

@implementation NSArray (OKBatchedSubarrays) 

- (NSArray *)subarraysWithBatchSize:(NSUInteger)batchSize 
{ 
    NSMutableArray *outputBatches = [NSMutableArray array]; 

    // or arrayWithCapacity:([self count] + (batchSize - 1))/batchSize 
    // if you want to be really explicit, but it's not important to the example 

    NSRange subarrayRange = NSMakeRange(0, batchSize); 
    while(subarrayRange.location < self.count) 
    { 
     // make sure we're not about to ask for out-of-bounds data 
     if(subarrayRange.location + subarrayRange.length > self.count) 
      subarrayRange.length = self.count - subarrayRange.location; 

     // add another batch to the output array 
     [outputBatches addObject:[self subarrayWithRange:subarrayRange]]; 

     // advance beyond the range we just grabbed 
     subarrayRange.location += subarrayRange.length; 
    } 

    return outputBatches; 
} 

@end 

然後在其他地方你只是做:

NSArray *thingsToFetch = <... whatever ...>; 

for(NSArray *batch in [thingsToFetch subarraysWithBatchSize:100]) 
{ 
    // post to server with all things in 'batch' 
}