- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 NSFetchedResultsController 和 NSSortDescriptor 提供自定义排序。
由于无法通过 NSSortDescriptor 消息 -(id)initWithKey:ascending:selector: 进行自定义排序(请参阅 here ),因此我尝试使用 NSSortDescriptor 派生类来覆盖compareObject:toObject: 消息。
我的问题是,compareObject:toObject: 并不总是被调用。似乎只有当数据已经在内存中时才会调用它。当第一次从存储中检索数据时,有某种优化使用基于数据库的排序而不是compareObject:toObject。 (参见here)。
我的问题是:如何强制 NSFetchedResultscontroller 使用compareObject:toObject: 消息对数据进行排序? (以及它是否适用于大数据集)
一种解决方案是使用二进制存储而不是 sqlite 存储,但我不想这样做。
另一个解决方案是:
-调用performFetch通过SQL对数据进行排序(不调用compareObject)
-对数据进行修改并反转。
-再次调用performFetch(调用compareObject)
它在我的情况下确实有效,但它是一个黑客,我不确定它是否总是有效(特别是对于大数据集(大于批量大小))。
更新:您可以使用 CoreDataBooks 示例进行重现。
在 RootViewController.m 中,添加这个丑陋的 hack:
- (void)viewWillAppear:(BOOL)animated {
Book* book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book"
inManagedObjectContext:[self fetchedResultsController].managedObjectContext];
[[self fetchedResultsController] performFetch:nil];
[[self fetchedResultsController].managedObjectContext deleteObject:book];
[self.tableView reloadData];
}
在 RootViewController.m 中,将排序描述符代码替换为:
MySortDescriptor *myDescriptor = [[MySortDescriptor alloc] init];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:myDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
添加 MySortDescriptor 类:
@implementation MySortDescriptor
-(id)init
{
if (self = [super initWithKey:@"title" ascending:YES selector:@selector(compare:)])
{
}
return self;
}
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
//set a breakpoint here
return [[object1 valueForKey:@"author" ] localizedCaseInsensitiveCompare:[object2 valueForKey:@"author" ] ];
}
//various overrides inspired by [this blog post][3]
- (id)copy
{
return [self copyWithZone:nil ];
}
- (id)mutableCopy
{
return [self copyWithZone:nil ];
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
return [self copyWithZone:zone ];
}
- (id)copyWithZone:(NSZone*)zone
{
return [[MySortDescriptor alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}
- (id)reversedSortDescriptor
{
return [[[MySortDescriptor alloc] initWithKey:[self key] ascending:![self ascending] selector:[self selector]] autorelease];
}
@end
最佳答案
引用您的问题和评论。您需要将对象拉入内存中以对它们进行排序。一旦它们被存储在内存中,您就可以使用一种方便的方法来确定距某个点的距离。
要减少拉入内存的对象数量,您可以计算最大值和最小值,然后对这些值进行过滤,从而在排序之前减小搜索半径。
除非计算值在内存中,否则无法对其进行排序。
关于iphone - 使用 NSFetchedResultController 进行自定义排序(子类化 NSSortDescriptor),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4106184/
我有一个实体类型,作为其属性之一,它具有单个字符。我想检索与谓词匹配的所有此类实体,并且希望它们首先按该字符排序,然后按索引号(这是其另一个属性)排序。 如果我只使用内置的排序描述符,这很简单....
我正在使用 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
我是一名优秀的程序员,十分优秀!