SwiftData|避免使用 UserDefault 存储 PersistentIdentifier

了解在使用 SwiftData 时,为何应当避免通过 UserDefaults 存储 PersistentIdentifier,并提供更安全、稳定的替代方案。

有时候,我们需要使用 UserDefault 存储用户的偏好设置。当这个偏好选项是一个 SwiftData 对象的时候,我们可能会考虑存储对象的 PersistentIdentifier。

PersistentIdentifier 无法被恢复

PersistentIdentifier 在恢复的时候,由于缺少 ModelContext 上下文(新的 ModelContext 已变化),因此无法恢复。

就像保存了一个"房间号",但没有保存"是哪栋楼",解码后只剩下一个无法使
用的房间号。—— 无法通过恢复后的信息找到指定的 SwiftData 对象

恢复后的 PersistentIdentifier:

实际的 PersistentIdentifier:

可以看到丢失了一部分信息。

解决方案

解决方案有两个:

  • 使用自定义的 UUID 属性
  • 存储 name 或 title 字段(推荐)