我正在尝试执行类似于下面的任务:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entry"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(version == %@)", @"1.0"];
[request setPredicate:predicate];
NSArray *results = [[AppDelegate applicationDelegate].managedObjectContext executeFetchRequest:request error:nil];
int i = 0;
while (i < results.count) {
Entry *entry = [results objectAtIndex:i];
entry.version = @"1.1";
i++;
}
但是在它通过每个结果之前,它会耗尽内存。
我知道这一点:
[request setFetchBatchSize:20];
但我想知道这将如何与我所拥有的一起工作?它会在 20 个结果后停止处理,还是只抓取前 20 个结果,然后以某种方式抓取下一个 20 个结果并继续?
我问的本质上是我如何只抓取一定数量的数据,以阻止它耗尽内存,然后抓取另一批?
你猜对了。你必须使用setFetchBatchSize:
.这将仅返回前 20 个对象。如果要获取接下来的 20 个对象,则必须使用 setFetchOffset:
设置偏移量。
这是使用@autoreleasepool
的完美情况
在循环中执行的所有代码周围放置一个@autoreleasepool。这将在处理对象后自动释放对象,因此您的内存占用量保持较低。如果使用此技术,则不必指定批大小。
有关更多信息,请参阅此处的苹果文档;
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html