由于未决请求错误,CoreData 在 MacOS 应用程序上将数据同步到云时出现问题

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- 无法执行请求,因为有一个待处理的...看起来同步操作被触发了两次...

另外,我想提的是 - 当我重新启动应用程序时,应用程序将正确同步......

所以现在,我所做的就是:

  1. 应用程序委托:
    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)

  1. 在ViewController中导入完成后
do {
    try managedContext!.save()
    managedContext?.commitEditing()    
} catch {
    print(error)
    return
}
Run Code Online (Sandbox Code Playgroud)

然后就是我上面提到的同步数据错误的问题。对于开发,我使用 macOS 10.15.4 和 Swift 5.2...有什么提示吗?可能存在一些我目前没有看到的问题。如有任何帮助,我们将不胜感激:)