gpt4 book ai didi

swift - 强制 NSPersistentContainer 更改核心数据

转载 作者:行者123 更新时间:2023-12-03 09:20:41 26 4
gpt4 key购买 nike

我刚刚添加了一个选项,供用户在我的应用程序中切换云同步,我保存用户是否要在“useCloudSync”下的 UserDefaults 中使用 iCloud 同步。当应用程序运行时,我加载我的persistentContainer:

class CoreDataManager {
static let sharedManager = CoreDataManager()
private init() {}

lazy var persistentContainer: NSPersistentContainer = {
var useCloudSync = UserDefaults.standard.bool(forKey: "useCloudSync")

let containerToUse: NSPersistentContainer?
if useCloudSync {
containerToUse = NSPersistentCloudKitContainer(name: "App")
} else {
containerToUse = NSPersistentContainer(name: "App")
let description = containerToUse!.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}

guard let container = containerToUse, let description = container.persistentStoreDescriptions.first else {
fatalError("Hey Listen! ###\(#function): Failed to retrieve a persistent store description.")
}
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

container.loadPersistentStores(completionHandler: { (storeDescription, error) in

...

return container
}
}

当用户使用 UISwitcher 切换云同步时,我更改了 UserDefaults 中“useCloudSyc”的值,但应用程序不使用 NSPersistentCloudKitContainer直到他们强制关闭应用程序并再次重新运行它。我希望容器在用户切换开关以开始从 iCloud 加载数据时正确更改。

如何在 NSPersistentCloudKitContainer 之间切换当用户切换“CloudSync”时?

最佳答案

这是可能的方法

extension UserDefaults { // helper key path for observing
@objc dynamic var useCloudSync: Bool {
return bool(forKey: "useCloudSync")
}
}

class CoreDataManager {
static let sharedManager = CoreDataManager()

private var observer: NSKeyValueObservation?
private init() {
}

lazy var persistentContainer: NSPersistentContainer = {
setupContainer()
}()

private func setupContainer() -> NSPersistentContainer {

if nil == observer {
// setup observe for defults changed
observer = UserDefaults.standard.observe(\.useCloudSync) { [weak self] (_, _) in
try? self?.persistentContainer.viewContext.save() // save anything pending
if let newContainer = self?.setupContainer() {
self?.persistentContainer = newContainer
}
}
}

let useCloudSync = UserDefaults.standard.bool(forKey: "useCloudSync")

let containerToUse: NSPersistentContainer?
if useCloudSync {
containerToUse = NSPersistentCloudKitContainer(name: "App")
} else {
containerToUse = NSPersistentContainer(name: "App")
let description = containerToUse!.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}

guard let container = containerToUse, let description = container.persistentStoreDescriptions.first else {
fatalError("Hey Listen! ###\(#function): Failed to retrieve a persistent store description.")
}
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

container.loadPersistentStores { (storeDescription, error) in
// ...
}

return container
}
}

关于swift - 强制 NSPersistentContainer 更改核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61025346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com