- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个大约有 4000 行的 SQLite 支持的数据库,连接到 Core Data。该模型是一个简单的概览 -> 详细模型。每个概述(带有标题和副标题)都与包含详细信息的细节有关系。为了查看这些数据,我实现了一个带有 NSFetchedRequestController 的 UITableView。
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"registered_name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sort];
NSPredicate *filterPredicate = nil;
NSString *sectionName = nil;
NSString *cacheName = nil;
NSFetchedResultsController *aFetchedResultsController = nil;
aFetchedResultsController.delegate = self;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setFetchBatchSize:20];
[fetchRequest setSortDescriptors:sortDescriptors];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Info" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:filterPredicate];
aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:sectionName cacheName:cacheName];
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[fetchRequest release];
[sort release];
return aFetchedResultsController;`
我已经实现了一切并且它有效,但它运行缓慢。具体来说,我关心的是应用程序的启动。
这是在启动时减慢速度的查询(XCode 中的 SQL 调试标志):
CoreData: sql: SELECT 0, t0.Z_PK FROM ZINFO t0 ORDER BY t0.ZREGISTERED_NAME
CoreData: annotation: sql connection fetch time: 0.8773s
CoreData: annotation: total fetch execution time: 0.8976s for 4302 rows.
这在执行 performFetch 后立即发生。为什么 Core Data 觉得需要获取数据库的所有 4302 行并对其进行排序?如果我将 setLimit 设置为较小的值,比如 20,当然一切都运行得非常快,但我只显示 20 个结果。另一方面,我现在有 setBatchSize,效果很好,当我滚动 TableView 时,我可以在调试控制台中看到 SELECT 语句。但它仍会在启动时对 4302 行进行排序,我认为这不必要地减慢了应用程序的启动时间。
我打算根据 Apple 的 WWDC 2010 示例代码在 NSSortDescriptor 中实现规范化的字符串排序和 caseInsensitiveNumericCompare 选择器,但在我看来我在这里遗漏了一些简单的东西。
似乎我不能将自定义选择器 caseInsensitiveNumericCompare: 与 NSSortDescriptor 一起使用,因为我使用 SQLite 作为数据库。我真的不知道我还能做些什么来加快速度。也许 SQLite 使用缩短和规范化的字符串会更快地排序,这就是我接下来要尝试的。
使用规范化字符串(除 A-Z 和 0-9 外没有其他字母或符号),启动时间缩短至约 0.7 秒。不是很大的减少。我尝试的最后一件事是对数据库进行预排序,然后将增量 ID 分配给行。在 NSSortDescriptor 中,我将按这个数字 id 排序。根据我的 SQL 测试,它应该快大约 7 倍。
最佳答案
我解决了我自己的问题。这只是对可能遇到类似问题的任何人的提醒。 我犯的错误是没有在数据库端为必填字段创建索引。我只是在 XCode 的模型中单击了“索引”选项。如果您自己提供了 .sqlite 文件,显然这不会创建任何索引。
在一个奇怪的启动案例之后,Core Data 决定为我创建数据库,我看到执行了这些 SQL 语句:
2011-10-08 19:49:40.572 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZREGISTERED_NAME_INDEX ON ZINFO (ZREGISTERED_NAME)
2011-10-08 19:49:40.586 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZFIRSTLETTER_INDEX ON ZINFO (ZFIRSTLETTER)
2011-10-08 19:49:40.598 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZNAME_INDEX ON ZINFO (ZNAME)
2011-10-08 19:49:40.610 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZN_SL_NAME_INDEX ON ZINFO (ZN_SL_NAME)
2011-10-08 19:49:40.622 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZN_REGISTERED_NAME_INDEX ON ZINFO (ZN_REGISTERED_NAME)
2011-10-08 19:49:40.635 App[1717:307] CoreData: sql: CREATE INDEX ZINFO_ZDETAILS_INDEX ON ZINFO (ZDETAILS)
在我将这些索引复制到自己的数据库后,速度大大加快:
CoreData: sql: SELECT 0, t0.Z_PK FROM ZINFO t0 ORDER BY t0.ZREGISTERED_NAME
CoreData: annotation: sql connection fetch time: 0.1315s
CoreData: annotation: total fetch execution time: 0.1568s for 4161 rows.
我对这些数字非常满意。但是因为我现在已经对我的数据库进行了预排序,所以我可以为 NSSortDescriptor 使用一个数字。这让我想到:
CoreData: sql: SELECT 0, t0.Z_PK FROM ZINFO t0 ORDER BY t0.ZID
CoreData: annotation: sql connection fetch time: 0.0677s
CoreData: annotation: total fetch execution time: 0.0890s for 4161 rows.
所以不到百分之九秒,低于十分之九秒。
关于ios - NSSortDescriptor 的表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7697771/
我有一个实体类型,作为其属性之一,它具有单个字符。我想检索与谓词匹配的所有此类实体,并且希望它们首先按该字符排序,然后按索引号(这是其另一个属性)排序。 如果我只使用内置的排序描述符,这很简单....
我正在使用 NSSortdescriptor 对 NSArray 集合进行排序,然后我遇到了一种情况,其中要排序的特定 NSArray 包含一个 NSDictionary,而该 NSDictionar
那东西是使用冒泡排序吗?或者到底是什么?它如何在核心数据的 NSFetchRequest 上下文中工作? 最佳答案 NSSortDescriptor API 不指定算法(或者甚至,比如几乎所有的 Co
我有两种类型的反对意见:地点和历史项目。我正在尝试获取附加到任何历史记录项的位置,因此该位置的获取谓词是“history.@count > 0”,效果很好。 我还想使用 NSSortDescripto
我有一个 NSFetchRequest从核心数据中获取对象并使用简单的 NSSortDescriptor 对它们进行排序.根据用户的选择,我使用了几种不同的方法,但它们是这样的: NSMuta
我有一个带有显示地址 View 的 CoreData iphone 应用程序。 地址如下所示:“5 Blob Street, 2222, Suburbia”,其中“5 Blob Street”是 ad
我正在尝试对实体文件夹执行提取请求,并且我希望名为 xyz 的文件夹成为排序时的最后一个对象。 NSFetchRequest *fetchRequest = [[NSFetchRequest al
我正在使用 FetchedResultsController 来执行我的提取,我希望它按降序对对象进行排序。如果我在创建 NSSortDescriptor 时使用自定义比较器 block ,我会收到错
首先,这是我的数据结构(简化): CATEGORY -name -subcategories <- this is a to many relationship to SUBCATE
我正在使用 UIActionSheet 按其中一个键对数组中的 100 个词典进行排序。一些键是 NSStrings,另一些是 NSNumbers。这段代码完成了这项工作: -(void)action
我目前正在对名为“视频”的实体进行排序。我试图首先按格式为“2013 年 12 月 21 日”的记录日期对所有视频进行排序,然后是标题,它只是一个字符串。这是我正在使用的代码: - (void)vie
我正在尝试获取“Contractor”的实体。 Contractor 与另一个名为“Job”的实体存在一对多关系。所以一个承包商可以有很多工作。 我将如何创建 NSSortDescriptor,以便我
我有一组从服务器获取的自定义对象。 我想根据成本对数据进行排序。它们是我的数组中的一个 totalCost 字段,类型为 NSString。 现在我像这样使用 NSSortDescriptor:
我有一本字典,我想根据 firstName 按字母顺序排序: { id = 123; user = { firstName = "Test 15";
我想对用户创建的联系人进行排序,其中联系人的数据是大杂烩。某些联系人可能填写了每个字段或属性,例如lastName、firstName、公司、电话、电子邮件,而其他人可能只有名字、电子邮件或公司。 使
我正在使用 sortDescriptor 对我的 NSFetchRequest 结果进行排序。我正在做这个。 NSFetchRequest *request = [NSFetchRequest fet
我有一个名为“TruckNumber”的核心数据实体,它有一个字符串,因为它是唯一的属性。该字符串通常是 1-3 位整数(作为字符串),但有时可以包含字母,例如 TMP9。该属性的名称是“itsNot
我正在制作一个 NSFetchRequest 并希望我的结果按日期从 Core Data 返回。 dateLastViewed 属性是 Core Data 中的一个 NSDate,因此,我希望我的 c
我的数据模型是这样的: User (Entity) - valueOne (NSNumber Attribute) - valueTwo (NSNumber Attribute) 我正在使用 NSFe
在我的核心数据中,我要求 x 个按距离 (NSNumber[double]) 升序排序的对象。问题是它还给我返回负数。我知道这是有道理的,但我只想要正数,我该怎么做? NSManagedObjectC
我是一名优秀的程序员,十分优秀!