在每个核心数据项上执行任务时,如何避免内存不足?
我正在尝试执行类似下面的任务:
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。 这会在处理完成后自动释放这些对象,所以你的内存占用很less。 如果使用这种技术,你不应该指定一个批量大小。
有关更多信息,请参阅Apple文档。