met*_*man 7 core-data ios swift cloudkit swift5
我正在为 MacOS 编写一个应用程序,主要功能是将数据同步到 iCloud。我已经完成的所有工作就是 - 打开 Core-Data 和 CloudKit 选项的项目, - 创建一个模型和一些基本例程,通过将文件导入到应用程序来创建模型。
由于这是一个大文件,因此我在单独的线程/调度新队列中执行所有操作。当我调试应用程序时,将数据保存到本地数据库工作正常,然后当应用程序失去焦点时数据会同步到云,我不得不说它有效,我可以通过查询 CloudKit 仪表板中的数据来说明这一点。但是,当我开始导入文件以及在导入过程中我将切换到其他应用程序时,同步数据存在问题。导入完成后,我看到数据存储在本地,但无法同步到云端。相反,我在控制台中看到以下错误:
CoreData: 调试: CoreData+CloudKit: -PFCloudKitThrottledNotificationObserver noteRecievedNotification:: : 得到: NSApplicationWillBecomeActiveNotification - 0 CoreData: 调试: CoreData+CloudKit: -PFCloudKitThrottledNotificationObserver noteRecievedNotification:: : 得到: NSApplicationDidBecomeActiveNotification - 1 CoreData: CloudKit: CoreData+CloudKit: -PFCloudKitThrottledNotificationOb服务器注释已收到通知: : - 已经安排了一个块来响应“NSApplicationDidBecomeActiveNotification”,此后有 2 个通知。CoreData: debug: CoreData+CloudKit: -[PFCloudKitThrottledNotificationObserver noteRecievedNotification:]_block_invoke(49): : 为“NSApplicationWillBecomeActiveNotification”执行“AppActivateObserver”块,清除 2 次迭代。CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegate _scheduleAutomatedExportWithLabel:activity:completionHandler:: - 开始自动导出 - AppActivationExport: (null) CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegateexecuteMirroringRequest:error:: : 要求执行请求:41AA55D5- F8A9-4EA9-A12A-9CA05775EC03 CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegate _scheduleAutomatedImportWithLabel:activity:completionHandler:: - 开始自动导入 - AppActivationImport - 响应活动:(null) CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegateexecuteMirroringRequest :error:: : 要求执行请求: 3D212164-ABDF-4A44-A31D-1D5A9B19A9D9 CoreData: CloudKit: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _enqueueRequest:]_block_invoke(714): : 排队请求: 41AA55D5-F8A9-4EA9-A12A- 9CA05775EC03 CoreData:警告:CoreData + CloudKit:-[NSCloudKitMirroringDelegate _enqueueRequest:]_block_invoke_2(724):无法将请求排队:41AA55D5-F8A9-4EA9-A12A-9CA05775EC03错误域= NSCocoaErrorDomain代码= 134417“请求'41AA55 D5-F8A9-4EA9- A12A-9CA05775EC03' 已被取消,因为已经存在类型为 'NSCloudKitMirroringExportRequest' 的待处理请求。” UserInfo={NSLocalizedFailureReason=请求“41AA55D5-F8A9-4EA9-A12A-9CA05775EC03”已取消,因为已经存在类型为“NSCloudKitMirroringExportRequest”的待处理请求。} CoreData:CloudKit:CoreData + CloudKit:-[NSCloudKitMirroringDelegate _scheduleAutomatedExportWithLabel:activity:completionHandler: ]_block_invoke(2174):-完成自动导出-AppActivationExport-结果:成功:0 madeChanges:0错误:错误域= NSCocoaErrorDomain代码= 134417“请求'41AA55D5-F8A9-4EA9-A12A-9CA05775EC03'已被取消,因为已经存在类型为“NSCloudKitMirroringExportRequest”的待处理请求。” UserInfo={NSLocalizedFailureReason=请求“41AA55D5-F8A9-4EA9-A12A-9CA05775EC03”已取消,因为已经存在类型为“NSCloudKitMirroringExportRequest”的待处理请求。} CoreData:警告:CoreData + CloudKit:-NSCloudKitMirroringDelegate finishAutomatedRequestWithResult ::完成请求'41AA55D5-F8A9-4EA9-A12A-9CA05775EC03'结果:成功:0 madeChanges:0错误:错误域= NSCocoaErrorDomain代码= 134417“请求'41AA55D5-F8A9-4EA9 -A12A-9CA05775EC03' 已被取消,因为已经存在类型为 'NSCloudKitMirroringExportRequest' 的待处理请求。” UserInfo={NSLocalizedFailureReason=请求“41AA55D5-F8A9-4EA9-A12A-9CA05775EC03”已取消,因为已经存在类型为“NSCloudKitMirroringExportRequest”的待处理请求。} CoreData:CloudKit:CoreData + CloudKit:-[NSCloudKitMirroringDelegate _enqueueRequest:]_block_invoke(714 ): : 排队请求: 3D212164-ABDF-4A44-A31D-1D5A9B19A9D9 CoreData: 警告: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _enqueueRequest:]_block_invoke_2(724): 无法排队请求: 3D212164-ABDF-4A44-A31D-1D5 A9B19A9D9 错误域=NSCocoaErrorDomain Code=134417“请求‘3D212164-ABDF-4A44-A31D-1D5A9B19A9D9’已被取消,因为已经存在类型为‘NSCloudKitMirroringImportRequest’的挂起请求。” UserInfo={NSLocalizedFailureReason=请求“3D212164-ABDF-4A44-A31D-1D5A9B19A9D9”已取消,因为已经存在类型为“NSCloudKitMirroringImportRequest”的待处理请求。} CoreData:CloudKit:CoreData + CloudKit:-[NSCloudKitMirroringDelegate _scheduleAutomatedImportWithLabel:activity:completionHandler: ]_block_invoke(2150): - 完成自动导入 - AppActivationImport - 结果:成功:0 madeChanges:0错误:错误域= NSCocoaErrorDomain代码= 134417“请求'3D212164-ABDF-4A44-A31D-1D5A9B19A9D9'已被取消,因为已经存在类型为“NSCloudKitMirroringImportRequest”的待处理请求。” UserInfo={NSLocalizedFailureReason=请求“3D212164-ABDF-4A44-A31D-1D5A9B19A9D9”已取消,因为已经存在类型为“NSCloudKitMirroringImportRequest”的待处理请求。} CoreData:警告:CoreData+CloudKit:-NSCloudKitMirroringDelegate finishAutomatedRequestWithResult::已完成请求“3D212164 -ABDF-4A44-A31D-1D5A9B19A9D9' 结果:成功:0 madeChanges:0 错误:错误域=NSCocoaErrorDomain Code=134417“请求'3D212164-ABDF-4A44-A31D-1D5A9B19A9D9'已被取消,因为已经有一个待处理的请求输入“NSCloudKitMirroringImportRequest”。” UserInfo={NSLocalizedFailureReason=请求“3D212164-ABDF-4A44-A31D-1D5A9B19A9D9”已取消,因为已经存在类型为“NSCloudKitMirroringImportRequest”的待处理请求。} CoreData:调试:CoreData + CloudKit:-PFCloudKitThrottledNotificationObserver noteRecievedNotification :: :得到:NSApplicationWillResignActiveNotification - 0 CoreData: 调试: CoreData+CloudKit: -PFCloudKitThrottledNotificationObserver noteRecievedNotification:: : 得到:
所以上面所说的 - Error Domain=NSCocoaErrorDomain Code=134417- 无法执行请求,因为有一个待处理的...看起来同步操作被触发了两次...
另外,我想提的是 - 当我重新启动应用程序时,应用程序将正确同步......
所以现在,我所做的就是:
lazy var persistentContainer: NSPersistentCloudKitContainer = {
let container = NSPersistentCloudKitContainer(name: "TestContainer")
// container.viewContext.automaticallyMergesChangesFromParent = true
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
fatalError("Unresolved error \(error)")
}
container.viewContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyObjectTrumpMergePolicyType)
})
return container
}()
Run Code Online (Sandbox Code Playgroud)
我发现了一些像我一样设置合并策略的好习惯:container.viewContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyObjectTrumpMergePolicyType)
do {
try managedContext!.save()
managedContext?.commitEditing()
} catch {
print(error)
return
}
Run Code Online (Sandbox Code Playgroud)
然后就是我上面提到的同步数据错误的问题。对于开发,我使用 macOS 10.15.4 和 Swift 5.2...有什么提示吗?可能存在一些我目前没有看到的问题。如有任何帮助,我们将不胜感激:)
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |