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 【问题描述】:所以我有两个核心数据实体 - PersonObj
和 CheckInObj
。
每个帐户有多个人。每个人可以有多个签到,每个签到都有一个时间戳。
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 中对存储的数据模型提取进行排序