关于 SwiftData 和 CloudKit 注意事项,开发中应特别留意以下几个方面:
1. 并发同步和唯一性约束
- 并发同步问题:CloudKit 进行的是并发同步,因此你无法确定更改会立即同步。这会导致无法保证数据的唯一性,特别是在多设备同步时。
-
不能使用
@Attribute(.unique)
:由于 CloudKit 不支持强制执行唯一性约束,不能依赖@Attribute(.unique)
来确保属性的唯一性。你需要手动处理唯一性检查,如果你的应用中有唯一性需求,可能需要通过应用逻辑来实现。
2. 关系型数据的处理
- 关系处理不保证原子性:iCloud 服务器在处理关系型数据时不保证原子性(即一次性完成)。这意味着在数据同步时,关系可能会部分更新或者不完整更新。因此,所有关系型数据必须设置为 可选(Optional),以防止关系在部分丢失或未同步时导致崩溃。
- 设置反向关系:SwiftData 可以在模型推断中自动设置关系的反向关系(Inverse Relationship),如果无法推断出,你必须 显式设置反向关系,否则保存时会出错。
3. 属性要求
- 可选或默认值:所有与 CloudKit 同步的 SwiftData 属性必须是 可选类型(Optional) 或者必须有 默认值。如果属性不符合这两个要求,CloudKit 同步将无法正常工作,这可能导致应用的同步功能失效。
4. 架构(Schema)限制
- 架构的只增性:CloudKit 的数据架构只能 增加,一旦将架构发布到生产环境后,就不能删除模型类型或更改现有属性。因此,在开发和设计数据模型时,必须仔细规划,避免在未来需要进行重大调整时受限于无法删除或更改的架构。
开发中应该注意的关键点:
- 手动处理唯一性逻辑:由于 CloudKit 不支持自动唯一性检查,开发者需要确保在数据创建和更新时自行处理唯一性逻辑,避免数据重复。
- 关系字段要设为可选:所有关系属性应设置为可选类型,以应对 CloudKit 同步中的关系不一致问题。并且需要手动设置关系的反向引用。
- 确保所有属性可选或有默认值:在设计数据模型时,必须确保所有与 CloudKit 同步的属性要么是可选的,要么有明确的默认值,确保同步正常工作。
- 仔细规划数据架构:在发布到生产环境前,仔细规划数据模型,因为发布后无法删除或更改模型结构。这意味着在开发早期就需要预见未来的扩展性需求。
总结
开发时需要针对 CloudKit 的限制做充分的准备,包括手动处理数据的唯一性、关系的可选性和反向引用的设置,以及确保数据模型属性满足同步的要求。最重要的是,仔细规划数据模型的架构,避免日后遇到无法更改的限制。