使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序

Posted

技术标签:

【中文标题】使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序【英文标题】:sorting data of type NSSet of a to-many relationship using NSSortDescriptor 【发布时间】:2015-12-12 20:49:02 【问题描述】:

考虑以下数据模型:

entity:                            entity:
- Order                            - Product
attribute:                         attribute: 
- date                             - productName
- orderName
relationship:                      relationship: 
- products  <<—- many-to-many —->> - orders

我想显示按订单日期排序的所有产品,如果有很多订单与一个产品相关联,则按最早的订单日期显示。所有没有订单的产品都应该最后显示。

我不知道如何使用 NSSortDescriptor 做到这一点。显然,我可以获取所有产品数据,转换订单(类型为 NSSet)以确定最早的日期,然后按订单日期对产品进行排序。虽然我无法以这种方式进行这项工作,但它也无法与 NSFetchedResultsController 一起用于在 UITableView 中显示产品,并且可能非常非常非常低效。

我怎样才能以更有效的方式进行这种排序,因为它也可以使用 SQL?如果需要,应该如何修改 NSFetchedResultsController? 类似于以下代码:

let fetchRequest = NSFetchRequest(entityName: “Product”)
let sortDescriptor1 = NSSortDescriptor(key: “product.order.date … ????”, descending: 
let sortDescriptor2 = NSSortDescriptor(key: “product WITHOUT order … ????”, descending: 

fetchRequest.predicate = NSPredicate(format: “productName contains[cd] %@", “A”)
fetchRequest.sortDescriptors = [sortDescriptor1,sortDescriptor2]

let fetchedResultController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

在 cellForRowAtIndexPath 中获取数据

let product = fetchedResultController.objectAtIndexPath(indexPath) as! Product

【问题讨论】:

【参考方案1】:

似乎不可能根据另一个实体的属性(NSSet 类型)对一个实体进行排序。原因是 FRC 一次只监视一个实体,从而阻止了更复杂的排序。

目前,我从 Core Data 切换到 Realm,问题很容易解决(以及其他几个我可以解决的问题)。

【讨论】:

以上是关于使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

用于核心数据一对多关系的 NSSortDescriptor

FetchedResultsController NSSortDescriptor 用于一对多关系

创建 NSSortDescriptor

核心日期一对一排序

使用 NSSortDescriptor 对 NSOrderedSet 进行排序

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