我会尽可能多地提供代码,以便我可以解释发生了什么。但这是一个简短的概述。用户按下拉出大列表(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"];
}
}
任何人有任何想法或类似问题。它非常令人困惑,因为它很快就会出现,直到它们与列表交互。
喜欢听到一些建议,即使它只是方向性,或者我应该探索更多的东西。 谢谢!
答案 0 :(得分:0)
Instruments提供了几种不同的Core Data特定工具,您可以使用它们来分析情况:
根据你的描述,你应该从提取和未命中开始,然后是故障,看看会出现什么。
此主题还有一些很好的WWDC视频。