获取按某些特定 属性 分组的自定义 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
工作得很好,但我想如果 Realm
或 Array
为相同的工作提供一些 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 = "..."
...
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)
我的模型是这样的-
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
工作得很好,但我想如果 Realm
或 Array
为相同的工作提供一些 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 = "..."
...
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)