NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法

Posted

技术标签:

【中文标题】NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法【英文标题】:NSSortDescriptor most effective way to sort Core Data NSSet objects 【发布时间】:2015-08-07 23:37:56 【问题描述】:

所以我有两个核心数据实体 - PersonObjCheckInObj。 每个帐户有多个人。每个人可以有多个签到,每个签到都有一个时间戳

PersonObj 
NSSet * checkIns;


CheckInObj 
NSDate *timestamp

目标是按最近签到对所有人员进行排序。

NSSortDescriptor *nameDescriptor =  [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
NSArray *sortedCheckins = [person.checkIns sortedArrayUsingDescriptors:@[nameDescriptor]];
CheckInObject *mostRecentCheckin = [sortedMessages lastObject];

这给了我最近的签到。

我现在可以对一个临时缓存进行排序,其中包含我找到的与相应人员的最新签到数据,并使用它对每个人进行排序,最后得到一个已排序的人员列表。

问题是:

我可以以某种方式直接在 Person 的对象上运行它吗?

NSArray *persons = [account.persons allObjects];

代替

 for (Person *person in persons) 
 // find most recent checkin, save temp cache, and resort each time we see a new person in the loop
 

我可以构造一个很棒的排序描述符来为我做这件事吗?

我试过了。

 [NSSortDescriptor sortDescriptorWithKey:@"checkIns.timestamp" ascending:YES];

但它不会比较它,因为它是一个 NSSet。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你不能那样做,因为你需要一个聚合。 IE。如果您想获得第一个或最后一个签到,则在 people 上运行 checkIns.timestamp 不会声明。 (或平均值或其他。)除此之外,-sortDescriptorWithKey 需要一个键,而不是一个键路径。

但是,通常您可以使用 Person lastCheckIn 的计算属性来解决这个问题。这取决于您的具体情况,但您可以在每次更改 checkIns 数组时重新计算该属性(通过一次比较),或者如果有人试图检索它,则按需计算它。

【讨论】:

是的,拥有一个额外的属性让它变得超级简单,我明白了。但我想看看是否可以在没有人的情况下做到这一点。 您不选择简单解决方案的原因是什么?未存储计算属性。 我不知道你应用的设计理念,但是一个设计理念不允许你为一个简单(和广泛传播)的问题选择一个简单(和广泛传播)的解决方案,是......也许你应该重新检查哲学,而不是解决方案。 ;-) 大声笑。不,我相信有更好的方法。我会及时通知你。 我很确定没有。这个解决方案是有意的。但请让我继续直播。

以上是关于NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序

Core Data NSSet 对象的 NSSortdescriptor

使用 NSSortDescriptor 对 NSOrderedSet 进行排序

在 Swift Core Data 中对存储的数据模型提取进行排序

iPhone:无法对多对关系进行 NSSortDescriptor。如何排序?

使用 NSSortDescriptor 按时间倒序对 CoreData 进行排序