何が起こっているのかを説明できるように、できるだけ多くのコードを提供します。簡単な概要は次のとおりです。ユーザーは、大きなリスト (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"];
}
}
どなたでも、思い当たることや、似たような悩みをお持ちの方。リストを操作するまですぐに表示されるため、非常に混乱します。
たとえそれが単なる方向性であっても、またはもっと探求すべきことであっても、アドバイスを聞くのが大好きです. ありがとう!