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)
我们将 NSFetchedResultsController 与 tableview 结合使用。tableview 将向 NSFetchedResultsController 询问尽可能多的行,以填充它认为出于性能原因需要显示和保留的行。通过人为地保持批量大小较低,您会导致 NSFetchedResultsController 进行更多的往返存储。
将其设置为 100 左右,看看您的表现如何。如果批量大小为 100 时遇到性能问题,则可能需要规范化核心数据模型。查看 2010 年关于 Core Data 的 WWDC 视频。它有一个关于优化核心数据和与 NSFetchedResultsController 相关联的提取的精彩视频。
祝你好运
| 归档时间: |
|
| 查看次数: |
4483 次 |
| 最近记录: |