批量循环

时间:2013-10-11 23:20:21

标签: objective-c loops for-loop

在for循环中进行批处理的最佳方法是什么?今天所有的apis都有最多可以获取的项目。 例如,一批100条推文。在这种情况下,如果我有一个1001 ID的列表,我想查询有关的信息,那么我需要进行11次调用,每批100个。我会使用一个带有条件的for循环,一旦形成一批100就调用任务。 有一个更好的方法吗? 鉴于它是一种常见模式,难道不存在语言中的内置构造来处理这个问题吗?我错过了什么吗?

4 个答案:

答案 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'
}

答案 1 :(得分:0)

我结合了一段时间和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
          }
    }

答案 2 :(得分:0)

如果API一次限制你100条记录,那么是的,你需要发出11条请求,没有解决这个问题。

我可能会创建一个NSOperation来封装每个页面的请求,为你需要的所有页面创建一个(在这种情况下为11),然后将它们放入NSOperationQueue,作为每个操作完成后,您可以将结果放入内存中的一个整合数组中,也可以将它们写入Core Data。

答案 3 :(得分:0)

你的问题不清楚。但是如果你想每隔100次在for循环中做一些事情就行了 如果(ⅰ%100 == 0){ //做我的事        }