首页 > 解决方案 > Core Data 和 CloudKit 同步不一致

问题描述

我有一个使用公共数据库使用 Core Data 和 CloudKit 的应用程序。问题是删除似乎永远不会同步,添加和更改直到应用程序进入后台然后返回前台才会显示,甚至这些结果也不一致。

示例应用程序只是您在指定 SwiftUI 和 Core Data 时获得的默认应用程序。我在 CloudKit 仪表板中修改了 Schema,添加了两个索引 recordName 和 modifiedAt。

下面是 Persistence.swift 文件,所以要重现,新建一个项目,选择 Core Data 和 Use CloudKit,Add Capability for CloudKit 和 Remote Notifications,然后将 Persistence.swift 的内容替换为上面的内容。

import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        for _ in 0..<10 {
            let newItem = Item(context: viewContext)
            newItem.timestamp = Date()
        }
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
        return result
    }()

    let container: NSPersistentCloudKitContainer

    init(inMemory: Bool = false) {
        container = NSPersistentCloudKitContainer(name: "TestCKSink")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        
        guard let description = container.persistentStoreDescriptions.first else
        {
            fatalError()
        }
        //description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
        description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
        description.cloudKitContainerOptions?.databaseScope = .public
        container.viewContext.transactionAuthor = "Me"
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
        
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {

                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
}

我已经尝试过启用和不启用历史跟踪选项。正如我所说,这在某些时候有效。我也意识到我需要添加代码来强制刷新显示,但即​​使检查 CloudKit 仪表板并查询记录,有些根本没有显示在那里或需要很长时间才能到达(18 分钟)。

任何建议都会受到欢迎。

标签: swiftcore-datacloudkit

解决方案


我前段时间遇到过类似的问题,在初始化托管对象上下文时尝试以下设置:

managedObjectContext.automaticallyMergesChangesFromParent = true

推荐阅读