特定のサイズ(batchSize)のチャンクで多くのオブジェクトを処理しようとしています。このループは機能しているように見えますが、処理するレコードは半分だけです。関連するコードは次のとおりです。
{
//Prepare fetching products without images in the database
NSFetchRequest * productFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
//Sort by last changed photo first
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"photoModificationDate" ascending:NO];
[productFetchRequest setSortDescriptors:@[sortDescriptor]];
NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateString];
[productFetchRequest setPredicate:predicate];
//First get the total count
NSUInteger numberOfProducts = [self.backgroundMOC countForFetchRequest: productFetchRequest error: &error];
NSLog(@"Getting images for: %d products", numberOfProducts);
//Then set the batchsize to get chunks of data
NSUInteger batchSize = 25;
[productFetchRequest setFetchBatchSize: batchSize];
[productFetchRequest setFetchLimit:batchSize];
//Fetch the products in batches
for (NSUInteger offset = 0; offset < numberOfProducts; offset += batchSize) {
@autoreleasepool {
[productFetchRequest setFetchOffset: offset];
NSArray * products = [self.backgroundMOC executeFetchRequest:productFetchRequest error:&error];
NSLog(@"Offset: %d, number of products: %d", offset, [products count]);
if (!products) {
return NO;
}
for (Product * product in products) {
NSLog(@"Downloading photo for product: %@", product.number);
[self downLoadAndStoreImageForProduct:product];
}
[self saveAndResetBackgroundMOC];
}
}
return YES;
}
ログは、カウントの前半(numberOfProducts)で、期待どおりに機能することを示しています。したがって、25個の製品のチャンクが処理されます。その前半の後、ループ内のfetchrequestのレコード数は0になります。同じコードを再試行すると、(残りの)レコードの半分だけが処理されるため、合計で3/4になります。私は何が間違っているのですか?managedObjectContextは保存されるだけでなく、保存後にリセットされてメモリを節約することに注意してください。これをチャンクで行わないと、約3000枚の写真をダウンロードした後、プログラムが一貫してクラッシュします。