2

我正在为 MacOS 编写一个应用程序,主要功能是将数据同步到 iCloud。我已经做的只是 - 打开了 Core-Data 和 CloudKit 选项的项目, - 创建了一个模型和一些基本例程,通过将文件导入应用程序来创建模型。

由于这是一个大文件,我在单独的线程中执行所有操作/调度一个新队列。当我调试应用程序时,将数据保存到本地数据库可以正常工作,然后当应用程序失去焦点时数据会同步到云端,我不得不说它可以工作,我可以通过查询 CloudKit 仪表板中的数据来说明这一点。但是当我开始导入文件时同步数据存在问题,在导入期间我将切换到其他应用程序。导入完成后,我看到数据存储在本地,但无法同步到云端。相反,我在控制台中看到以下错误:

CoreData:调试:CoreData + CloudKit:-PFCloudKitThrottledNotificationObserver noteRecievedNotification:::得到:NSApplicationWillBecomeActiveNotification - 0 CoreData:调试:CoreData + CloudKit:-PFCloudKitThrottledNotificationObserver noteRecievedNotification:::得到:NSApplicationDidBecomeActiveNotification - 1 CoreData:CloudKit:CoreData + CloudKit:-PFCloudedKitThrottledRecievObserver : - 已经安排了一个块来响应“NSApplicationDidBecomeActiveNotification”,此后有 2 个通知。CoreData:调试:CoreData + CloudKit:-[PFCloudKitThrottledNotificationObserver noteRecievedNotification:]_block_invoke(49)::为“NSApplicationWillBecomeActiveNotification”执行“AppActivateObserver”块,清除2次迭代。CoreData:CloudKit:CoreData+CloudKit:41AA55D5-F8A9-4EA9-A12A-9CA05775EC03 CoreData:警告:CoreData+CloudKit:-[NSCloudKitMirroringDelegate _enqueueRequest:]_block_invoke_2(724):无法将请求入队:41AA55D5-F8A9-4EA9-A12A-9CA05775EC03 错误域 = NSCocoaErrorDomain 代码请求‘41AA55D5-F8A9-4EA9-A12A-9CA05775EC03’已被取消,因为已经有一个类型为‘NSCloudKitMirroringExportRequest’的待处理请求。” UserInfo={NSLocalizedFailureReason=Request '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 finishedAutomatedRequestWithResult::已完成请求“41AA55D5 -F8A9-4EA9-A12A-9CA05775EC03' 结果:成功:0 madeChanges:0 错误:错误域 = NSCocoaErrorDomain 代码 = 134417 “请求 '41AA55D5-F8A9-4EA9-A12A-9CA05775EC03' 已取消,因为已经有类型 ' 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=Request ' 3D212164-ABDF-4A44-A31D-1D5A9B19A9D9' 已取消,因为已经有一个类型为 'NSCloudKitMirroringImportRequest' 的待处理请求。} CoreData:警告:CoreData+CloudKit:-NSCloudKitMirroringDelegate finishedAutomatedRequestWithResult:: 完成请求'3D212164-ABDF-4A44-A31D-1D5A9B19A9D9' 结果:成功:0 madeChanges:0 错误:错误域=NSCocoaErrorDomain Code=134417“请求”3D212164-ABDF-4A44-A31D -1D5A9B19A9D9' 已被取消,因为已经有一个类型为 'NSCloudKitMirroringImportRequest' 的待处理请求。” UserInfo={NSLocalizedFailureReason=Request '3D212164-ABDF-4A44-A31D-1D5A9B19A9D9' 已取消,因为已经有一个类型为 'NSCloudKitMirroringImportRequest' 的待处理请求。} CoreData:调试:CoreData+CloudKit:-PFCloudKitThrottledNotificationObserver noteRecievedNotification:: : Got: NSApplicationWillResignActiveNotification - 0 CoreData:调试:CoreData+CloudKit:

所以上面所说的 - 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
    }()

我发现了一些像我一样设置合并策略的好习惯:container.viewContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyObjectTrumpMergePolicyType)

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

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

4

0 回答 0