Ios NSFetchedResultsController的性能不好

Ios NSFetchedResultsController的性能不好,ios,iphone,cocoa-touch,core-data,nsfetchedresultscontroller,Ios,Iphone,Cocoa Touch,Core Data,Nsfetchedresultscontroller,我正在尝试将项目从CoreData加载到UITableView中。我最初的做法是简单地从我的BankInfo实体中获取所有对象,将它们填充到一个数组中,然后使用该数组填充uitableviewcell: - (NSMutableArray *) bankInfos { NSManagedObjectContext *context = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchReq

我正在尝试将项目从
CoreData
加载到
UITableView
中。我最初的做法是简单地从我的
BankInfo
实体中获取所有对象,将它们填充到一个数组中,然后使用该数组填充
uitableviewcell

- (NSMutableArray *) bankInfos
{
    NSManagedObjectContext *context = [self managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"BankInfo" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSError *error;
    NSMutableArray *bankInfos = (NSMutableArray*)[context executeFetchRequest:fetchRequest error:&error];
    return bankInfos;
} 
我听说
NSFetchedResultsController
可以提高性能/内存管理,所以我尝试了一下(基本上按照推荐的方式实现):

在使用工具分析代码之后,我发现
NSFetchedResultsController
将对象加载到
UITableView
中的时间大约是我最初方法的两倍。特别是这一行:

BankInfo *bankInfo = [_fetchedResultsController objectAtIndexPath:indexPath]; 

加载整个
BankInfos数组需要292毫秒,而加载整个
BankInfos数组需要150毫秒。有人知道为什么会这样吗?

好吧,我们说的是ms,它仍然非常快

获取结果控制器正在对每个单元格的sqllite进行查询。您可以在xcode:
-com.apple.CoreData.SQLDebug 1
中打开sqllite调试,然后自己查看。 NSArray完全在内存中填充、存储和获取

在选择阵列和获取的控制器时,不能考虑“速度”

基本上,如果您有一个小的对象数组,在屏幕上是不可变的,那么您可以安全地选择NSArray作为表数据源


相反,如果您有很多对象或计划有越来越多的对象,这些对象也需要经常刷新,NSFetchedResultsController是首选。

好吧,我们说的是ms,它仍然相当快

获取结果控制器正在对每个单元格的sqllite进行查询。您可以在xcode:
-com.apple.CoreData.SQLDebug 1
中打开sqllite调试,然后自己查看。 NSArray完全在内存中填充、存储和获取

在选择阵列和获取的控制器时,不能考虑“速度”

基本上,如果您有一个小的对象数组,在屏幕上是不可变的,那么您可以安全地选择NSArray作为表数据源


相反,如果您有很多对象或计划有越来越多的对象,这些对象也需要经常刷新,NSFetchedResultsController是首选。

我遇到的问题与CoreData性能无关,但这与我在tableview中意外地将全尺寸图像保存/加载为缩略图有关。一旦我解决了这个问题,性能问题就消失了。

我遇到的问题与CoreData性能无关,而是与我在tableview中意外地将全尺寸图像保存/加载为缩略图有关。一旦我解决了这个问题,性能问题就消失了。

您确定这不是过早优化的情况吗?当你滚动时,每秒会有多少帧?@MichaelG.Emmons-每秒的帧数非常糟糕,只有在20秒(请注意,这是一部iPhone4)时,由于每个单元最初都会加载BankInfos,因此非常不稳定。你确定这不是过早优化的情况吗?当你滚动时,每秒有多少帧?@MichaelG.Emmons-每秒的帧数非常糟糕,只有在20秒(请注意,这是一部iPhone4),这是非常不稳定的,因为每个单元最初都会加载BankInfos。+1谢谢。问题其实是我的错(见下文)。+1谢谢。问题其实是我的错(见下文)。如果您想进一步提高性能,通常最好将图像放在单独的实体中。这允许核心数据对图像数据进行故障处理,直到需要时再进行故障处理。我通常会这样做,即使我只存储缩略图。@MichaelG.Emmons-谢谢你提醒我这一点,记住苹果在《核心数据指南》中也推荐了这一点。如果你想进一步提高性能,通常最好将图像放在单独的实体中。这允许核心数据对图像数据进行故障处理,直到需要时再进行故障处理。我通常会这样做,即使我只存储缩略图。@MichaelG.Emmons-谢谢你提醒我这一点,记住苹果在核心数据指南中也推荐了这一点。
BankInfo *bankInfo = [_fetchedResultsController objectAtIndexPath:indexPath];