【问题标题】:Using Realm Swift soring issue使用 Realm Swift 问题
【发布时间】:2018-01-25 04:01:24
【问题描述】:

这里是示例代码:

let outstandingStudentIDs = ["BGHH2", "AGHH1", "DFGH", "DFGHJ"]

let realmResult = realm.objects(Student.self).filter("studentID in %@", outstandingStudentIDs)

realmResult 未按优秀学生 ID 保持排序。

如何在Results<Element: RealmCollectionValue>.中进行自定义排序并保留对象类型 如果将realmResult转换为Array进行排序,使用notificationToken观察结果变化后如何返回Results

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    您应该能够将sorted 链接到该结果中。

    https://realm.io/docs/swift/latest#sorting***

    let realmResult = realm.objects(Student.self).filter("studentID in %", outstandingStudentIDs).sorted(byProperty: "studentID")
    


    长答案:

    要进行所需的自定义排序,您需要使用sorted(by:)。不幸的是,这将返回一个数组而不是 Results 实例。

    通常,Results 实例会被延迟评估,除非您希望对其进行排序。在这种情况下,Realm 需要遍历整个数据集以确保它以正确的顺序返回对象。如果您提供自己的比较函数,Realm 必须假设您的代码是“不安全的”并且可能会导致问题。

    让 Realm 爆炸的例子:

    let realm = try! Realm()
    try! realm.write {
        _ = realm.create(Student.self, value: ["studentId": "1"])
        _ = realm.create(Student.self, value: ["studentId": "2"])
    }
    let results = realm.objects(Student.self).sorted(by: { (_, _) -> Bool in
        try! realm.write {
            realm.deleteAll()
        }
        return false
    })
    print(results)
    

    这会打印一个友好的:

    [[invalid object], [invalid object], [invalid object], [invalid object]]
    

    简答:

    很确定它不能完成,但我欢迎有人展示一个体面的解决方案。

    【讨论】:

    • 我想按优秀学生ID序列而不是学生ID字母顺序对结果进行排序
    • 我认为使用sorted 应该会得到Results
    • @EpicPandaForce OP想要做的排序不能用那个函数来完成,它需要一个比较闭包。
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多