我将提供尽可能多的代码,以便我可以解释发生了什么。但简要概述是这样的。用户按下拉出大列表(UITableView)的按钮。大约 30,000 个条目。它从核心数据中获取了这一点。而且根本不需要时间。
然而,在这个 UITableView 中,每个项目都可以被“选中”,它会改变 Core Data 中的状态。如果且仅当用户选择一个项目时,列表在被关闭并重新访问后需要 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"];
}
}
任何人都有任何想法或类似的问题。这非常令人困惑,因为它出现得如此之快,直到他们与列表交互。
喜欢听一些建议,即使它只是方向性的,或者我应该进一步探索的东西。谢谢!