CoreData:保存状态会使数据变得非常滞后

时间:2013-09-02 23:00:38

标签: iphone ios objective-c core-data

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

任何人有任何想法或类似问题。它非常令人困惑,因为它很快就会出现,直到它们与列表交互。

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

1 个答案:

答案 0 :(得分:0)

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

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

根据你的描述,你应该从提取和未命中开始,然后是故障,看看会出现什么。

此主题还有一些很好的WWDC视频。