在for循环中进行批处理的最佳方法是什么?今天所有的apis都有最多可以获取的项目。 例如,一批100条推文。在这种情况下,如果我有一个1001 ID的列表,我想查询有关的信息,那么我需要进行11次调用,每批100个。我会使用一个带有条件的for循环,一旦形成一批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'
}
答案 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){ //做我的事 }