使用 Core Data 高效显示 100,000 个项目

2023-12-28

我正在使用 NSFetchResultsController 在 UITableView 中显示 100,000 多条记录。这可以工作,但速度很慢,尤其是在 iPad 1 上。加载可能需要 7 秒,这对我的用户来说是一种折磨。

我还希望能够使用分段,但这至少会额外增加 3 秒的时间。

这是我的 NSFetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController {

    if (self.clientsController != nil) {
        return self.clientsController;
    }

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];
    [request setPredicate:[NSPredicate predicateWithFormat:@"ManufacturerID==%@", self.manufacturerID]];
    [request setFetchBatchSize:25];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]  initWithKey:@"UDF1" ascending:YES];
    NSSortDescriptor  *sort2= [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObjects:sort, sort2,nil]];

    NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"Name", @"ManufacturerID",@"CustomerNumber",@"City", @"StateProvince",@"PostalCode",@"UDF1",@"UDF2", nil];
    [request setPropertiesToFetch:propertiesToFetch];

    self.clientsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                        managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:nil];

    return self.clientsController;

}

我有一个关于ManufacturerID的索引,它在我的NSPredicate中使用。这似乎是一个非常基本的 NSFetchRequest - 我可以做些什么来加快速度?或者我刚刚遇到了限制?我肯定错过了什么。


第一:您可以使用NSFetchedResultsController的缓存以加快第一次获取后的显示速度。这应该很快就会下降到几分之一秒。

第二:您可以尝试仅显示第一屏,然后在后台获取其余部分。我通过以下方式执行此操作:

  • 当视图出现时,检查是否有首页缓存。
  • If not, I fetch the first page. You can accomplish this by setting the fetch request's fetchLimit.
    • 如果您使用节,请执行两次快速获取以确定第一个节标题和记录。
  • Populate a second fetched results controller with your long fetch in a background thread.
    • 您可以创建一个子上下文并使用performBlock: or
    • use dispatch_async().
  • 将第二个 FRC 分配给表视图并调用reloadData.

这在我最近的一个超过 200K 记录的项目中效果很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Core Data 高效显示 100,000 个项目 的相关文章

随机推荐