0

我正在尝试执行与此类似的任务:

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 并继续?

我基本上要问的是我如何只抓取一定数量的数据,以阻止它耗尽内存,然后再抓取另一批?

4

2 回答 2

0

你猜对了。你必须使用setFetchBatchSize:. 这只会返回前 20 个对象。如果要获取接下来的 20 个对象,则必须使用setFetchOffset:.

于 2012-09-16T16:21:39.617 回答
0

这是使用@autoreleasepool

在循环中执行的所有代码周围放置一个@autoreleasepool。这将在对象被处理后自动释放它们,因此您的内存占用保持在较低水平。如果使用这种技术,您不必指定批量大小。

有关更多信息,请参阅此处的苹果文档;

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

于 2012-09-16T16:31:55.453 回答