0

何が起こっているのかを説明できるように、できるだけ多くのコードを提供します。簡単な概要は次のとおりです。ユーザーは、大きなリスト (UITableView) を取得するボタンを押します。約30,000件のエントリー。これは Core Data から取得します。時間がかかりません。

ただし、この UITableView では、各項目を「選択」することができ、Core Data 内の状態を変更します。IF およびユーザーが項目を選択した場合のみ、リストを閉じて再アクセスした後、プルアップするのに 400% ~ 1000% 長くかかります。そして、セルが「選択」された後に何回プルアップして閉じても、常に同じ時間がかかります。

さらに、ユーザーが何も触れない場合。それは非常に迅速に開閉し、無限の回数です。

さて、コードタイム。

ビューが読み込まれるときの基本的なフェッチ リクエスト。バッチを 20 エントリに制限します。

-(void)viewDidLoad{
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:self.entityName];
    fetchRequest.fetchBatchSize = 20;
    NSSortDescriptor *serverSort = [[NSSortDescriptor alloc] initWithKey:@"sortid" ascending:YES];

    fetchRequest.sortDescriptors = @[serverSort];
    fetchRequest.returnsObjectsAsFaults = YES;

    searchFilter = [[NSString alloc] init];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[(id)[[UIApplication sharedApplication] delegate] managedObjectContext] sectionNameKeyPath:nil cacheName:self.entityName];
    self.fetchedResultsController.delegate = self;
}

ここで問題が発生します。セルの選択状態を保存します。ユーザーがアイテムを選択した後 (このコードを実行)、ラグが発生します。彼らが何をしても。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSFetchedResultsController *resultsController = [self fetchedResultsControllerForTableView:tableView];
    NSManagedObject *managedObject = [resultsController objectAtIndexPath:indexPath];

    if ([[managedObject valueForKey:@"selected"] isEqual:@YES]) {
        [managedObject setValue:@NO forKey:@"selected"];
    } else {
        [managedObject setValue:@YES forKey:@"selected"];
    }
}

どなたでも、思い当たることや、似たような悩みをお持ちの方。リストを操作するまですぐに表示されるため、非常に混乱します。

たとえそれが単なる方向性であっても、またはもっと探求すべきことであっても、アドバイスを聞くのが大好きです. ありがとう!

4

1 に答える 1

0

インスツルメンツは、状況を分析するために使用できるいくつかの異なる Core Data 固有のツールを提供しています。

  • コア データ フェッチ executeFetchRequest:error: の呼び出しを記録し、要求が行われたエンティティ、返されたオブジェクトの数、およびフェッチにかかった時間に関する情報を提供します。
  • Core Data Saves save: の呼び出しと、保存にかかった時間を記録します。
  • コア データ フォールト オブジェクトおよび関係フォールトの発生に関する情報を記録します。オブジェクトの障害については、障害が発生しているオブジェクトを記録します。リレーションシップ エラーの場合、ソース オブジェクトと発生したリレーションシップを記録します。どちらの場合も、障害の発生にかかった時間を記録します。
  • コア データ キャッシュ ミス ファイル システム アクティビティを具体的に引き起こす障害の動作を追跡し、利用可能なデータがない障害が発生したことを示し、データの取得にかかった時間を記録します。

あなたの説明に基づいて、フェッチとミスから始めて、次にフォールトして、何が起こるかを確認する必要があります。

このトピックに関する優れた WWDC ビデオもいくつかあります。

于 2013-09-03T17:34:30.600 に答える