【问题标题】:Sort by array index using Realm and NSPredicate使用 Realm 和 NSPredicate 按数组索引排序
【发布时间】:2015-10-20 19:07:03
【问题描述】:

我有一个 ID 数组:[INT]。现在我想选择所有具有这些id的对象,但需要按照ids数组中id的顺序。

let IDs = [2, 6, 3, 4, 10, 9]
let predicate = NSPredicate(format: "id IN %@", IDs)
let objects = realm.objects(Item.self).filter(predicate)

但最终,对象的排序方式与 ID 不同。有什么方法可以按正确的顺序对这些对象进行排序?

【问题讨论】:

    标签: nspredicate realm


    【解决方案1】:

    您可以使用sort()

    let IDs = [2, 6, 3, 4, 10, 9]
    let predicate = NSPredicate(format: "id IN %@", IDs)    
    do {
        let realm = try Realm()
        let objects = realm.objects(Item).filter(predicate).sort({ IDs.indexOf($0.id) < IDs.indexOf($1.id) })
    } catch {        
    }
    

    【讨论】:

    • 这种方法将物化每个匹配查询的单个对象的 Swift 类实例以执行排序操作。使用Results.sorted(_:) 来避免这种急切的实现。但是,对于应用 Realm 不支持的自定义排序算法,这种方法很好(甚至是必要的)。
    • 谢谢。这行得通。但是,我们需要在使用 .sort 之前实现所有对象。但是,Results.sorted 无法检测 IDs 数组中 id 的顺序。
    • 问题要求自定义排序算法,因此无法实现对象。
    【解决方案2】:

    在Realm中,Results符合RealmCollectionType协议,它有一个sorted(_:)成员函数。这个函数接受SortDescriptors的序列,它们是StringLiteralConvertible,使它们非常容易使用:

    let realm = try! Realm()
    let IDs = [2, 6, 3, 4, 10, 9]
    let objects = realm.objects(Item).filter("id IN %@", IDs).sorted(["id"])
    

    【讨论】:

    • 我尝试使用 sorted("id") 但这不是我需要的。我想按照数组 ID 中的 id 顺序对项目进行排序。
    • 我明白了。那么 joern 的回答是目前最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2016-06-03
    • 2017-11-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多