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

Get array(from Realm) of custom class grouped by some specific property

我的模型是这样的-

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 { [=12=] }

        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]]

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

我想稍后在 UICollectionView 中填充该数组,其中 arrayOfarrays.count 是节数,arrayOfArray[section].count 是该节中的项目数。

Realm 使使用关系进行分组变得容易。因为与 SQL 不同,Realm 获取关系的成本非常低。也就是说,不是在fetch的时候分组,而是提前以分组的状态保存。

保存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)