NSSortDescriptor 对核心数据获取请求没有影响

Posted

技术标签:

【中文标题】NSSortDescriptor 对核心数据获取请求没有影响【英文标题】:NSSortDescriptor has no effect on Core Data fetch request 【发布时间】:2020-06-21 23:40:34 【问题描述】:

我的核心数据实体“Entry”有 4 个属性,包括我想要排序的属性“key”。 “key”是非可选且唯一的。核心数据结构:

我正在像这样从 Core Data 中获取对象:

var entries: [NSManagedObjectID : NSManagedObject] = [:]    

class func fetchEntriesfromPersistentStore () 
    
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else  return 
    let managedContext = appDelegate.persistentContainer.viewContext
    
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Entry")
    
    let sort = NSSortDescriptor(keyPath: \Entry.key, ascending: true)
    fetchRequest.sortDescriptors = [sort]
    
    do 
        let fetchesEntries = try managedContext.fetch(fetchRequest)
        entries = Dictionary(uniqueKeysWithValues: fetchesEntries.map ($0.objectID, $0) )
        
     catch let error as NSError 
        print("Could not fetch entries. \(error), \(error.userInfo)")
    

我还尝试了 NSSortDescriptor 的以下初始化,就像在 official documentation 中一样:

let sort = NSSortDescriptor(key: "key", ascending: true)

生成的字典总是以随机顺序排列的,即每次执行的顺序都不同。我确认上面的代码已执行。删除 NSSortDescriptor 对结果也没有影响。

我在对象存储到字典之前检查了列表fetchesEntries,它没有排序。

ios 部署目标是 13.4、Swift 5.0、Xcode 11.5、macOS 10.15.5

【问题讨论】:

我很惊讶这个编译:NSSortDescriptor(keyPath: \Entry.key。这是您正在与之交谈的 Cocoa / Objective-C。您需要一个 Objective-C 键路径,而不是 Swift 键路径。 结果字典总是随机排列的。是的,这不是错误,而是功能。字典根据定义是无序的。 【参考方案1】:

试试

let sort = NSSortDescriptor(key: #keyPath(Entry.key), ascending: true)

【讨论】:

以上是关于NSSortDescriptor 对核心数据获取请求没有影响的主要内容,如果未能解决你的问题,请参考以下文章

NSSortDescriptor 按核心数据对多关系中的项目数排序

执行获取请求时,我必须在核心数据中提供 NSSortDescriptor 吗?

使用 NSSortDescriptor 按时间错误排序(带有核心数据)

核心数据和 NSSortDescriptor 未根据基于 NSString 的第三个描述符排序

核心数据 - 可以使用 NSSortDescriptor 中的块对 TableView 进行排序吗?

在托管对象上下文中添加 NSSortDescriptor 以获取请求?