我的核心数据模型说明:
以下是我获取问题的代码:
let fetchRequest = NSFetchRequest(entityName: "Issue")
fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let frc = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: dataManager.context,
sectionNameKeyPath: nil,
cacheName: nil)
return arc
即使我有项目对象的所有问题,我更喜欢使用获取结果控制器获取问题,因此它们将始终更新,我喜欢与表的集成。在使用FRC显示项目之前,我也喜欢导航控制器屏幕。
正如您在代码中看到的那样,问题按名称参数排序。
但是我希望按照我将它们保存在项目的NSMutableOrderedSet中的顺序对它们进行排序。
AFAIK当它用于核心数据时,我不能将NSSortDescriptor与比较器/选择器一起使用。
你知道怎么做吗?提前谢谢。
答案 0 :(得分:2)
如果您使用关系密钥路径(在您的情况下为parentProject
),它将根据有序集进行排序。所以你可以使用
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]
首先按项目对它们进行排序,然后在每个项目组中按照与关系中有序集相同的顺序对其进行排序。您可以选择使用sectionNameKeyPath
将每个问题的项目放在不同的部分。
如果你不首先使用parentProject.name
(或类似的东西 - 比如parentProject.lastUpdated
)那么它们只能按照orderedSet的顺序排序。换句话说,它将是所有第一个问题,然后是所有第二个问题等。这可能不是你想要的。
答案 1 :(得分:1)
这可能是一个混乱,但无论如何。在我看来,你的第一次提取是一个过滤器..例如,向我展示这个项目的问题。也许你可以在选定的问题上执行第二次获取,这次不过滤它们,而是对它们进行排序?
关于CoreData,我有一个这样的排序提取:
func fetchItem() {
print(#function)
let sortDescriptor: NSSortDescriptor!
let defaults: UserDefaults = UserDefaults.standard
if defaults.integer(forKey: "sequenceSwitchValue") == 0 {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
} else {
sortDescriptor = NSSortDescriptor(key: "itemName", ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
}
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: itemEntity)
request.sortDescriptors = [sortDescriptor]
let predicate: NSPredicate = NSPredicate(format: "itemName == %@", incomingItemName)
request.predicate = predicate
do {
items = try context.fetch(request) as! [ItemEntity]
} catch let error as NSError {
print("Error While Fetching Data From DB: \(error.userInfo)")
}
if items.count > 0 {
let currentItem = items[0]
您可以将关系值用于谓词..
答案 2 :(得分:1)
你可能不想听到这个,但不幸的是,你不能。 NSFetchedResultsController无法使用sortDescriptors基于有序的一对多关系进行排序。您应该向Apple提交错误。您应该抛弃NSFetchedResultsController并自己处理它的委托方法。
答案 3 :(得分:-2)
保持秩序的最简单方法是为&#34;问题添加属性&#34;实体。名为position
的{{1}}类型的Int
。并使用排序描述符,它将按此position
属性