0

よし、これが状況だ。テキストと画像 (かなり大きな画像) を含むドキュメントを保存およびロードできるプログラムを作成しています。バックエンドについては、 CoreData とUIManagedDocument独自のサブクラス of (これを と呼びましょうNotificationDocument) を使用してNSManagedDocumentいます。

現在、それぞれNotificationDocumentに、保存された保存スロットと保存された名前を表す 2 つの属性があります。ドキュメントのリストとそれらが保存されているスロットを表示するTableViewがあります(例:「保存スロット1:テンプレートのクリーニング」)。

ただし、このテーブルビューにデータを入力するには永遠にかかります。私がやっていることはviewDidLoadにあります:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"];
NSArray *notifications = [self.database.managedObjectContext executeFetchRequest:fetchRequest error:nil];

すべての notificationDocuments を完全に取得してメモリに移動しているため、プログラムの実行が非常に遅いと疑うのは当然のことです。すべての notificationDocuments が本当に必要ないことを考えると、これを行うためのより良い (より高速な) 方法はありますか?それらの保存スロットと保存名属性のみが必要です。これを達成するための最良の方法は何ですか?

保存スロットをそれらに保存された名前にマッピングするマップ エンティティを CoreData に保存することも考えました。ただし、完全に別のエンティティを保存せずにこれを行う良い方法があれば、それが望ましいでしょう。ありがとう。

4

3 に答える 3

3

を使用して動的NSFetchedResultsControllerに入力する必要があります。UITableViewそうすれば、現在のメソッドではなく、新しいセルが要求されたときに Core Data 呼び出しが動的に行われます。現在のメソッドでは、ビューの読み込み時にほとんどのデータは必要ありませんが、一度にすべてのデータが読み込まれます。

これは、データを設定する必要がある大まかなコードです (fetchedResultsController は、それが含まれるビュー コントローラーのプロパティである必要があります)。

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"attribute" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];


    fetchedResultsController = [[NSFetchedResultsController alloc]
                                initWithFetchRequest:fetchRequest
                                managedObjectContext:self.database.managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:@"ListCache"];
    fetchedResultsController.delegate = self;
    NSError *error = nil;
    [fetchedResultsController performFetch:&error];

そして、ここに正しいドキュメントを取得する行がありますcellForRowAtIndexPath(明らかに、正しいオブジェクト クラスではない可能性があります)。

NotificationDocument *currentDocument = [fetchedResultsController objectAtIndexPath:indexPath];

このようにすると、速度が大幅に向上することに気付くでしょう。

于 2012-06-19T20:54:47.563 に答える
0

コアデータから一連のアイテムを取得するために、次も使用できます

[nsfetchReqObj setFetchBatchSize:size];

また、フェッチの速度も向上します。

于 2014-02-20T07:37:03.197 に答える
0

Dimaが言ったように、おそらく NSFetchedResultsController を使用するのが道です。

以前も利用したことがありますので、気になる方はこちらもチェックしてみてください。

https://github.com/rafaeladson/intern-objc/blob/master/InternIOS/BaseTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/SampleTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/BaseTableViewControllerTest.m

これでうまくいかない場合は、Xcode の Instruments アプリを使用して、問題の原因を突き止めてみてください。

于 2012-06-19T21:00:08.667 に答える