如何为 CoreData 数据库切换 iCloud 同步?

问题描述 投票:0回答:0

我想要允许打开和关闭 CoreData 数据库的iCloud 同步。当用户切换设置时,调用

updateContainer()
。如果应用程序在启用 iCould 同步的情况下启动,则同步有效。但是在 iCould 关闭并重新打开后,同步不起作用。

在控制台的垃圾 CloudKit 日志中,我发现了两个可疑警告:

CloudKit setup failed because there is another instance of this persistent store actively syncing with CloudKit in this process.
Told to tear down with reason: Error NSCocoaErrorDomain:134410

有人有过如何实现这一点的经验并且知道这里出了什么问题吗?

这是我的

PersistenceController.swift

import CoreData

class PersistenceController {
    static var shared = PersistenceController()
    
    lazy var container: NSPersistentContainer = {
        setupPersistentContainer()
    }()
    
    func updateContainer() {
        saveContext()
        container = setupPersistentContainer()
    }
    
    func saveContext() {...}
    
    private func setupPersistentContainer() -> NSPersistentContainer {
        // this value is synchronised across devices via NSUbiquitousKeyValueStore in iCloud
        let iCloudSyncEnabled = UserDefaults.standard.bool(forKey: iCouldSyncKey)
        
        var persistentContainer = getPersistentContainer(iCloudSync: iCloudSyncEnabled)
        
        guard let description = persistentContainer.persistentStoreDescriptions.first else {
            fatalError("Could not get persistentStoreDescription")
        }
        
        // Set merge policy
        persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        
        // Enable HistoryTracking: This allows a non-iCloud persistent container to keep track of changes if a user changes their mind and turns it on.
        description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
        
        if iCloudSyncEnabled {
            persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
            description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
        }
        
        persistentContainer.loadPersistentStores { storeDescription, error in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error)")
            }
        }
        
        return persistentContainer
    }
    
    private func getPersistentContainer(iCloudSync iCloudSyncEnabled: Bool) -> NSPersistentContainer {
        let modelName = "Model"
        if iCloudSyncEnabled {
            print("Using NSPersistentCloudKitContainer")
            return NSPersistentCloudKitContainer(name: modelName)
        } else {
            print("Using NSPersistentContainer")
            return NSPersistentContainer(name: modelName)
            
        }
     }
}

此方法部分基于CoreData+CloudKit |打开/关闭 iCloud 同步切换

swift core-data cloudkit
© www.soinside.com 2019 - 2024. All rights reserved.