获取由某些特定属性分组的自定义类的数组(来自Realm)

时间:2017-09-27 11:49:07

标签: swift realm nsarray grouping

我的模型看起来像这样 -

class Model: Object {
    dynamic var id: String?
    dynamic var sessionId: String?

    static var all: [Model] {
        get {
            // Get all and return them
        }
    }

    static func getAllModelsGroupedBySessionId() -> [[Model]] {
        let all = Model.all

        var set = Set<String>()
        for element in all {
            if let sessionId = element.sessionId {
                set.insert(sessionId)
            }
        }

        let uniqueSessionIds = set.map { $0 }

        var array: [[Model]] = []

        for sessionId in uniqueSessionIds {
            var arr:[Model] = []
            for element in all {
                if element.sessionId == sessionId {
                    arr.append(element)
                }
            }
            array.append(arr)
        }
        return array
    }
}

我的po Model.all是:

▿ 3 elements
  ▿ 0 : Model {
    id = one;
    sessionId = A;
}
  ▿ 1 : Model {
    id = two;
    sessionId = B;
}
  ▿ 2 : Model {
    id = three;
    sessionId = B;
}

po Model. getAllModelsGroupedBySessionId()

▿ 2 element
  ▿ 0 : 1 elements
    ▿ 0 : Model {
    id = one;
    sessionId = A;
  }
  ▿ 1 : 2 elements
    ▿ 0 : Model {
    id = two;
    sessionId = B;
  }
    ▿ 1 : Model {
    id = three;
    sessionId = B;
  }

所以我的getAllModelsGroupedBySessionId效果很好,但我希望如果RealmArray为同一项工作提供了一些API。

arrayOfArrays = Model. getAllModelsGroupedBySessionId()

一个例子是 -

[[allmodelsWithSessionIdAsOne], [allmodelsWithSessionIdAsTwo]]

我不想对它们进行排序,我想要一个“数组数组”,其中有一组具有相同会话ID的元素数组。

我希望稍后在UICollectionView中填充该数组,其中arrayOfarrays.count是截面数,arrayOfArray[section].count是该部分中的项目数。

1 个答案:

答案 0 :(得分:1)

Realm可以很容易地使用关系进行分组。因为与SQL不同,Realm获取关系非常便宜。换句话说,不是在提取时进行分组,而是事先将其保存在分组状态中。

保存Model对象时,您可以添加代码以同时进行分组,如下所示。

let model = Model()
model.sessionId = "..."
...

GroupaddModel()实现在这里:

Group.addModel(model)

class Model: Object {
    dynamic var id: String?
    dynamic var sessionId: String?
}

class Group: Object {
    dynamic var sessionId: String?
    let models = List<Model>()

    static override func primaryKey() -> String? {
        return "sessionId"
    }

    static func addModel(_ model: Model) {
        let realm = try! Realm()
        if let sessionId = model.sessionId {
            if let group = realm.object(ofType: Group.self, forPrimaryKey: sessionId) {
                try! realm.write {
                    group.models.append(model)
                }
            } else {
                let group = Group()
                group.sessionId = sessionId
                group.models.append(model)
                try! realm.write {
                    realm.add(group)
                }
            }
        }
    }
}

您可以获得您提到的相同分组数据结构,只需获取Group个对象。

realm.objects(Group.self)