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

これは、を使用するのに最適なケースです。@autoreleasepool

ループで実行されるすべてのコードの周りに@autoreleasepoolを配置します。これにより、オブジェクトが処理された後に自動的に解放されるため、メモリフットプリントは低く抑えられます。この手法を使用する場合は、バッチサイズを指定する必要はありません。

詳細については、こちらのアップルのドキュメントを参照してください。

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

于 2012-09-16T16:31:55.453 に答える
0

あなたは正しいと思いました。を使用する必要がありますsetFetchBatchSize:。これは、最初の 20 個のオブジェクトのみを返します。次の 20 個のオブジェクトを取得する場合は、 を使用してオフセットを設定する必要がありますsetFetchOffset:

于 2012-09-16T16:21:39.617 に答える