iPad上的核心数据获取速度非常慢

时间:2011-05-04 20:55:28

标签: ios core-data ipad

我使用iOS 4.3.2跟踪在iPad上运行的Core Data抓取请求。

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"feed.account.name == %@ AND feed.feedType == %@", accountName,feedType];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" 
                                                               ascending:NO];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

fetchedResultsController=[self createFetchedResultsController:@"RssFeedItem"  predicate:predicate sortDescriptors:sortDescriptors];

[fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];


[fetchedResultsController.fetchRequest setFetchLimit:500];

[fetchedResultsController setDelegate:self];

[fetchedResultsController performFetch:&error];

return [fetchedResultsController fetchedObjects];

我在SQLite数据库中为RssFeedItem表提供了大约688行数据,在所有其他表中有少于100行。使用调试日志记录将该查询记录为:

CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.ZURL, t0.ZHEADLINE, t0.ZISREAD, t0.ZORIGIN,           
CoreData: annotation: sql connection fetch time: 3.3854s
CoreData: annotation: total fetch execution time: 3.4178s for 688 rows.

它运行速度非常慢(超过3秒)。我有所有必需的搜索字段和排序字段的索引。我假设也许2路连接使它变慢,但不确定为什么它会那么慢。有没有办法优化这个代码或查询,或者还有什么我应该看看?

2 个答案:

答案 0 :(得分:2)

我想减慢查询速度的行是

 [fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray 
 arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];

[fetchedResultsController.fetchRequest setFetchLimit:500];

我很好奇,为什么你需要一次获取所有这些属性(和500个项目)?

答案 1 :(得分:1)

这看起来有点慢。我不知道这是否会产生巨大的速度差异,但它应该有所帮助,修改你的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"feed.feedType == %@ AND feed.account.name == %@", feedType, accountName];

您希望首先放置最便宜的条件,以便在所有情况下都不必检查更昂贵的条件。检查帐户名称时发生的连接要贵得多。此外,根据Feed类型值的样子,将它切换为整数可能会更快(我假设它当前是一个字符串,因为它是一个对象)。