SwiftData中如何实现类似CoreData的ObjectID URI书签功能?
SwiftData中保存对象标识符到UserDefaults的解决方案
在SwiftData里直接编码PersistentIdentifier会得到空值,是因为它的Codable实现仅暴露了内部空的实现结构,无法生成有效可持久化数据。正确的做法是利用PersistentIdentifier提供的urlRepresentation()方法来生成可存储的URL字符串,和你之前CoreData的用法逻辑一致:
保存对象标识符到UserDefaults
// 获取模型的PersistentIdentifier let objectID = yourModel.objectID // 转换为URL表示 let bookmarkURL = objectID.urlRepresentation() // 保存URL的字符串形式到UserDefaults UserDefaults.standard.set(bookmarkURL.absoluteString, forKey: "TargetObjectBookmark")
从UserDefaults恢复并获取对象
// 从UserDefaults读取保存的URL字符串 guard let urlString = UserDefaults.standard.string(forKey: "TargetObjectBookmark"), let url = URL(string: urlString), // 通过URL重建PersistentIdentifier let identifier = PersistentIdentifier(url: url), // 从模型上下文获取对应对象 let targetModel = modelContext.model(for: identifier) as? YourModelType else { // 处理恢复失败的情况 return } // 成功获取到目标对象,进行后续操作 print("恢复的对象:\(targetModel)")
注意事项
- 不要直接对
PersistentIdentifier进行Codable编码,官方并未保证其编码后的结构稳定性,且当前实现无法生成有效数据。 urlRepresentation()是SwiftData官方提供的用于持久化标识符的方法,生成的URL可以安全存储,跨会话恢复对象。
内容的提问来源于stack exchange,提问作者DookieMan
相关产品推荐
相关产品推荐

