2

私はこの問題に何週間も取り組んできましたが、解決できないようです。アクションを実行するために、データベース内のすべてのエンティティを反復処理しています。しばらく NSFetchRequest を使用していましたが、停止しようとしたにもかかわらず、反復ごとにメモリ使用量が増加し続け、反復ごとにメモリが戻ってこなかったようです。現在、同じタスクに NSFetchedResultsController を使用しています。

これは私が持っているコードです:

NSFetchedResultsController:

- (NSFetchedResultsController *)updateController {

    if (_updateController != nil) {
        return _updateController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"creationDate" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:10];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil
                                                   cacheName:nil];
    self.updateController = theFetchedResultsController;

    return _updateController;

}

そして、それが実行されるコード:

    NSLog(@"update controller: %@", [self updateController]);

    if (![[self updateController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }


    int i = 0;

    id  sectionInfo = [[_updateController sections] objectAtIndex:0];

    NSLog(@"count: %i", [sectionInfo numberOfObjects]);

    NSManagedObject *entry;

    while (i < [sectionInfo numberOfObjects]) {

        @autoreleasepool {

            entry = [_updateController.fetchedObjects objectAtIndex:i];

            NSLog(@"entry: %@", [entry valueForKey:@"message"]);

            NSLog(@"context 1: %@", [entry managedObjectContext]);
            NSLog(@"context 2: %@", [[self updateController] managedObjectContext]);

            [[entry managedObjectContext] refreshObject:entry mergeChanges:NO];

            NSLog(@"i: %i", i);

            i++;

        }

    }

楽器はこれを示しています:

ここに画像の説明を入力

タイムラインでその期間をクリックすると、表示されているテーブルのエントリが選択されます。タスクを実行しているグラフの期間、データ使用量は 1.14mb から 1.17mb にわずかに増加しています。この段階ではそれほど多くはありませんが、NSData 画像などのより大きなデータを処理するコードを追加すると、アプリのデータ使用量が増加し、最終的にメモリが不足してクラッシュすることになります。アプリの 1.0 バージョンは既にアプリ ストアにあるため、コア データに NSData を含めないという選択肢はありません。

誰かが助けてくれることを願っています、ありがとう。

4

2 に答える 2

1

実際に大量のオブジェクトをデータ ストアに追加しようとしたことがありますか? それとも、これまでにベンチマークしたデータに基づいて推定していますか? Core Data は通常、メモリ消費の管理に非常に優れています。

コア データは、問題のオブジェクトを使用しなくなり、メモリ使用量が増えていることを検出すると、オブジェクトを障害に戻し、関連するすべてのメモリを解放します。

を使用NSFetchRequestするsetFetchBatchSize:ことも役立ちます。データストアからより多くのオブジェクトを要求すると、一度にすべてではなく、小さなバッチでディスクからオブジェクトをフェッチします。

于 2012-09-28T01:04:58.167 に答える
0

画像などの多くのデータを保存する各オブジェクトで有効にできるオプションがあります。1MBを超えるデータをディスクにファイルに保存します。これにより、メモリ使用量が減少します。

バイナリデータ記事

于 2012-09-28T00:53:56.693 に答える