Swift结合Realm开发时如何实现CollectionView单元格从新到旧排序
问题原因
- 仅按
day字段做降序排序,未引入月份维度做优先判断:跨月场景下会出现更早月份的大日期任务排在更晚月份的小日期任务之前的错误,比如1月31日的任务会排在2月1日的任务之前。 - 同一天添加的任务没有次级排序规则,默认按写入顺序升序排列,导致同天内旧任务排在新任务之前。
- 额外优化点:手动遍历Realm查询结果转数组再排序的性能远低于Realm原生的排序接口,数据量较大时会有明显卡顿。
解决方案
最优方案:新增创建时间字段,严格匹配添加顺序
直接新增创建时间字段记录任务写入时间,排序逻辑最准确,不会受日期字段限制:
- 修改Realm数据模型,新增
createDate字段
class RealmItems: Object { @objc dynamic var header = String() @objc dynamic var specification = String() @objc dynamic var day = Int() @objc dynamic var month = Int() @objc dynamic var deadline = String() @objc dynamic var status = String() // 新增创建时间字段,写入任务时会自动取当前时间 @objc dynamic var createDate = Date() }
- 重写
getTasks()方法,用Realm原生排序接口按创建时间倒序
func getTasks() -> [RealmItems] { // ascending设为false即为降序,最新添加的任务排在最前 let sortedResult = realm.objects(RealmItems.self).sorted(byKeyPath: "createDate", ascending: false) return Array(sortedResult) }
注意:开发阶段新增字段可以直接卸载重装App生效,如果是已上线的版本需要补充Realm数据迁移逻辑。
兼容方案:不新增字段,用现有日期字段排序
如果你不需要严格匹配添加顺序,只需要按任务的截止日期从晚到早排列,不需要新增字段,直接调整排序规则,先按月降序,再按天降序即可:
func getTasks() -> [RealmItems] { let sortedResult = realm.objects(RealmItems.self).sorted(by: [ SortDescriptor(keyPath: "month", ascending: false), SortDescriptor(keyPath: "day", ascending: false) ]) return Array(sortedResult) }
内容的提问来源于stack exchange,提问作者user14685458
相关产品推荐
相关产品推荐

