Realm + Swift:如何利用Realm通知的indexPaths获取增改删对象主键?
通过RealmCollectionChange的indexPaths获取对象主键
完全可以通过indexPaths识别集合中的对象并获取主键,具体分场景处理:
插入/修改操作的indexPaths
对于insertions和modifications数组中的indexPaths,直接用indexPath.row作为索引,从回调返回的集合中取出对应对象,再访问其主键属性即可。
示例代码(假设你的Realm对象模型为Task,主键属性是id):
let tasks = realm.objects(Task.self) let notificationToken = tasks.observe { changes in switch changes { case .initial(let tasks): // 初始加载时遍历所有对象获取主键 tasks.forEach { print("初始对象主键:\($0.id)") } case .update(let tasks, deletions: _, insertions: insertions, modifications: modifications): // 获取插入对象的主键 insertions.forEach { indexPath in let task = tasks[indexPath.row] print("插入对象主键:\(task.id)") } // 获取修改对象的主键 modifications.forEach { indexPath in let task = tasks[indexPath.row] print("修改对象主键:\(task.id)") } case .error(let error): print("通知错误:\(error.localizedDescription)") } }
删除操作的indexPaths
注意:deletions数组中的indexPaths对应的是更新前集合中的位置,此时对象已从当前集合中移除,无法直接从回调返回的更新后集合中获取。如果需要获取删除对象的主键,可通过以下方式:
- 提前维护一个集合索引与对象主键的映射字典,在通知触发前缓存当前集合的主键信息,收到删除indexPaths后从字典中查找对应主键;
- 给单个对象注册独立通知,监听对象的删除事件。
内容的提问来源于stack exchange,提问作者wile_e_coyote
相关产品推荐
相关产品推荐

