为什么在设置提取批量大小时 NSFetchedResultsController 加载所有行?

tjg*_*184 2 iphone core-data objective-c

NSFetchedResultsController 设置为 5 以获取批量大小。我们注意到它的加载速度很慢,所以我们启用了 SQLDebug。出于某种原因,它一次加载 5 行,但它在初始加载时对所有 100 行执行此操作。加载后,它似乎一次加载 5 行。

在看控制台时,我看到查询运行了 20 次;共有 100 行。我原以为这会在前 5 行中运行 1 次,并且当您滚动时,会加载更多行。我还尝试更改提取大小,它具有相同的行为。

获取结果控制器的设置如下。

- (NSFetchedResultsController*) fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    [NSFetchedResultsController deleteCacheWithName:@"Root"];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Message" inManagedObjectContext:_context];

    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"conversation = %@", conversation];

    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
                              initWithKey:@"timestamp" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:5];

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                        managedObjectContext:_context sectionNameKeyPath:nil 
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    [sort release];
    [fetchRequest release];
    [theFetchedResultsController release];

    return _fetchedResultsController;    

}
Run Code Online (Sandbox Code Playgroud)

tim*_*man 6

我们将 NSFetchedResultsController 与 tableview 结合使用。tableview 将向 NSFetchedResultsController 询问尽可能多的行,以填充它认为出于性能原因需要显示和保留的行。通过人为地保持批量大小较低,您会导致 NSFetchedResultsController 进行更多的往返存储。

将其设置为 100 左右,看看您的表现如何。如果批量大小为 100 时遇到性能问题,则可能需要规范化核心数据模型。查看 2010 年关于 Core Data 的 WWDC 视频。它有一个关于优化核心数据和与 NSFetchedResultsController 相关联的提取的精彩视频。

祝你好运