我想要允许打开和关闭 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)
}
}
}