2

すでに同様の質問をしましたが、まだ機能しません。30,000 件以上のレコードを含むコア データ データベースがあります。テーブルビューにフェッチしようとしています。コアデータに関する WWDC のプレゼンテーションを見ましたが、プレゼンターが提案したことは何でもうまくいきませんでした。そのテーブルからほとんどのフィールドを削除し、nsstring と日付を含む 4 つだけを残しました。私は setFetchBatchSize を異なる数値で使用しましたが、インストゥルメントを使用するとき、フェッチ コントローラーは 30k レコードすべてをフェッチしていました。私はそれを見ましたが、フェッチを下げるために何をしているのかまだわかりません. 別のスレッドを使用して svprogreshud を表示しましたが、スレッドがすぐに実行されないため、さらに遅くなったと思います。

また、データは12のセクションに分割されており、コアデータベースにはセクションを設定するための1文字のフィールドがあります。

-com.apple.CoreData.SQLDebug 1 も設定し、デバイスで実行すると、すべてのレコードを含むフェッチ要求の読み込みに 3 秒かかりましたが、CoreData: sql: pragma cache_size=200 CoreData: annotation: total fetch execution time: 3.1087s が表示されました36684 行の場合。

ここにコードの一部があります

-(void)useDocument{

    if (self.peopleDatabase.documentState == UIDocumentStateClosed){
        [self.peopleDatabase openWithCompletionHandler:^(BOOL success){
            [self setupFetchResultsController];

        }];

    } else if (self.peopleDatabase.documentState == UIDocumentStateNormal){
        [self setupFetchResultsController];
    }     
}

-(void)setupFetchResultsController
{

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"people"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pplicon" ascending:YES]];
    [NSFetchedResultsController deleteCacheWithName:nil];
    self.fetchedResultsController = nil;

    [request setFetchBatchSize:50];
    //[request setFetchLimit:100];

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:self.peopleDatabase.managedObjectContext sectionNameKeyPath:@"pplicon" cacheName:@"peopleCache"]; 
}

前もって感謝します!

更新ジョディ、答えてくれてありがとう。
テーブルへのコア データ セットアップに移動し、インデックス化された pplicon がチェックされます。他に何か確認する必要がありますか。私はwwdcビデオの指示に従い、NSManagedObjectContext executefetchを示すコアデータフェッチでインストゥルメントを実行しました..フェッチカウント36684、次にフェッチカウント12の別のもの また、サンプラーでは、peopleviewcontroller setupfetchResultsContoroller 363.75msおよびUIAplication Run 287.6msに費やされたほとんどの時間。アクティビティ モニターでは、アプリは 91 MB の実メモリを消費します。今回は何か改善点はありますか?他に何を確認して、電話が切れた場所を確認できますか?

セクションまで。以前はセクションに表示されていたデータベース pplicon に文字があり、データはそれによって並べ替えられます。

現在のデータ モデルには、文字列として 5 つの属性、日付として 1 つの属性を持つ 1 つのエンティティがあります。

4

2 に答える 2

0

セクション名は計算されますか? セクション名が計算されると、Core Data はそれらすべてを自動的に取得し、セクション名を呼び出して正しく並べ替えます。

于 2012-05-09T00:30:31.257 に答える
0

過去に非常によく似た質問にコメントしたと思います。Instrumentsを実行して、その内容を確認する必要があります。どこで時間を費やしているかを正確に教えてくれます。

高価なセクションを使用しています。セクション属性「pplicon」はデータベースにインデックスとして設定されていますか? そうでない場合は、データベース内のすべてのアイテムをスキャンする必要があります。すべてのレコードをスキャンしない可能性がある唯一の方法は、それをインデックスにすることです。内部では、インデックス テーブルを使用して一意のインデックス値を取得できる場合があります。ただし、セクション オブジェクトを返す必要があります。

繰り返しになりますが、テスト中は計測器オンにして、どこで時間を費やしているかを正確に確認できるようにする必要があります。

于 2012-05-09T00:46:03.643 に答える