Nie*_*aan 6 macos nsmanagedobject swift cloudkit nspersistentcloudkitcontainer
我有一个用于NSPersistentCloudKitContainer与 iCloud 同步数据的应用程序。用户报告偶尔数据丢失,之后我开始调试我的实现。
我的应用程序实现的一部分是显示一个弹出窗口,其中显示信息并有一个确认按钮。当用户单击此按钮时,自定义NSManagedObject子类的一个或多个实例将被修改。
同时,NSPersistentCloudKitContainer在应用程序退出并激活时触发镜像过程。当用户单击上述确认按钮时会发生这种情况。它通过执行NSCloudKitMirroringExportRequest和NSCloudKitMirroringImportRequest请求来做到这一点。
换句话说,在我的应用程序中,数据同时被修改(通过代码显式)和镜像(通过 CloudKit 隐式),这就是出错的地方。
本质上是这样的:
NSTimeInterval实例的属性 ( )NSManagedObject增加(例如 0 + 1 = 1)。NSPersistentCloudKitContainer 当应用程序激活或退出时隐式开始镜像数据。在这个阶段,我希望属性的值与最新的(本地)更改相匹配(因此在我的示例 2 中)。但相反,它匹配初始增量(因此在我的示例 1 中),覆盖我最新的(本地)更改导致数据丢失。显然,NSCloudKitMirroringImportRequest恢复到镜像进程启动时的状态,这也可以在日志中看到:
CoreData: debug: CoreData+CloudKit: -[PFCloudKitImporterZoneChangedWorkItem applyAccumulatedChanges:error:]
[…]
Importing updated records:
(
"<CKRecord: 0x10225b560; recordID=5458F9C8-7BE2-4563-92DE-650ED4C643F5:(com.apple.coredata.cloudkit.zone:__defaultOwner__), recordChangeTag=23, values={\n \"CD_activity\" = \"3E497A4C-6467-48F4-B7F4-6F1B2B7BC779\";\n \"CD_date\" = \"2020-04-26 07:28:00 +0000\";\n \"CD_duration\" = \"1\";\n \"CD_entityName\" = Mutation;\n}, recordType=CD_Mutation>"
)
Run Code Online (Sandbox Code Playgroud)
在这个阶段,我不确定这是否是NSPersistentCloudKitContainer我的应用程序中的错误,但它肯定会导致数据不可靠。?目前我有这些问题:
NSPersistentCloudKitContainer(特别是由于NSCloudKitMirroringImportRequest)导入“更新”的记录而这些记录仅在本地发生更改?换句话说:我已经有了最新版本的记录。由于那些“更新”的记录具有过时的值,这会覆盖我较新的更改,因此会导致数据丢失。跳过这些更新的发生将解决我的问题。有没有办法控制这种行为?NSPersistentCloudKitContainer在应用程序激活或退出时安排镜像过程而自动发生的。有没有办法控制这种行为?例如,当应用程序激活或退出时,我可以禁用镜像过程吗?我注意到NSCloudKitMirroringDelegateOptions默认为,其中包括automaticallyScheduleImportAndExportOperations:YES。我可以改变这个吗?在数据突变不太可能发生的时刻,我是否也可以自己明确触发镜像过程?最后,当我没有连接到互联网时(因此,CloudKit 无法镜像数据),可以发现上述情况的确认,事情按预期工作。
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |