我的模型看起来像这样 -
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
效果很好,但我希望如果Realm
或Array
为同一项工作提供了一些API。
arrayOfArrays = Model. getAllModelsGroupedBySessionId()
一个例子是 -
[[allmodelsWithSessionIdAsOne], [allmodelsWithSessionIdAsTwo]]
我不想对它们进行排序,我想要一个“数组数组”,其中有一组具有相同会话ID的元素数组。
我希望稍后在UICollectionView
中填充该数组,其中arrayOfarrays.count
是截面数,arrayOfArray[section].count
是该部分中的项目数。
答案 0 :(得分:1)
Realm可以很容易地使用关系进行分组。因为与SQL不同,Realm获取关系非常便宜。换句话说,不是在提取时进行分组,而是事先将其保存在分组状态中。
保存Model对象时,您可以添加代码以同时进行分组,如下所示。
let model = Model()
model.sessionId = "..."
...
Group
和addModel()
实现在这里:
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)