0

我将提供尽可能多的代码,以便我可以解释发生了什么。但简要概述是这样的。用户按下拉出大列表(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"];
    }
}

任何人都有任何想法或类似的问题。这非常令人困惑,因为它出现得如此之快,直到他们与列表交互。

喜欢听一些建议,即使它只是方向性的,或者我应该进一步探索的东西。谢谢!

4

1 回答 1

0

Instruments 提供了几种不同的 Core Data 特定工具,您可以使用它们来分析情况:

  • Core Data Fetches 记录对 executeFetchRequest:error: 的调用,提供有关发出请求的实体、返回的对象数量以及获取所用时间的信息。
  • Core Data Saves 记录 save: 的调用以及执行保存所花费的时间。
  • 核心数据故障记录有关对象和关系故障触发的信息。对于对象故障,记录发生故障的对象;对于关系错误,记录源对象和被触发的关系。在这两种情况下,记录触发故障所需的时间。
  • 核心数据缓存未命中 跟踪特别导致文件系统活动的故障行为——指示触发了没有可用数据的故障——并记录检索数据所花费的时间。

根据您的描述,您应该从获取和未命中开始,然后是错误并查看出现了什么。

还有一些关于这个主题的优秀 WWDC 视频。

于 2013-09-03T17:34:30.600 回答