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

Sle*_*lee 5 core-data nsfetchrequest ipad

我使用NSFetchResultsController在UITableView中显示100,000 +记录.这有效,但它很慢,特别是在iPad 1上.加载可能需要7秒钟,这对我的用户来说是一种折磨.

我也希望能够使用部分,但这至少会增加3秒的时间.

这是我的NSFetchResultsController:

- (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;

}
Run Code Online (Sandbox Code Playgroud)

我有一个在我的NSPredicate中使用的ManufacturerID索引.这看起来像一个非常基本的NSFetchRequest - 我能做些什么来加快这个速度?或者我刚刚达到了限制?我肯定错过了什么.

Mun*_*ndi 7

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

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

  • 出现视图时,请检查是否有第一页缓存.
  • 如果没有,我会抓第一页.您可以通过设置获取请求来完成此操作fetchLimit.
    • 如果您正在使用部分,请执行两次快速提取以确定第一部分标题和记录.
  • 使用后台线程中的长提取来填充第二个提取的结果控制器.
    • 您可以创建子上下文并使用performBlock:
    • dispatch_async().
  • 将第二个FRC分配给表视图并调用reloadData.

这在我最近的一项有超过200K记录的项目中运作良好.