强制NSPersistentContainer更改核心数据

ap123

我刚刚为用户添加了在我的应用程序内切换云同步的选项,该选项将用户是否要在“ 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
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 NSPersistentContainer 拆除并重建核心数据堆栈

来自分类Dev

核心数据:更改NSManagedObjectContextObjectsDidChangeNotification中的对象

来自分类Dev

核心数据不会保存更改

来自分类Dev

核心数据-更改属性类型

来自分类Dev

无需迁移的核心数据更改数据模型

来自分类Dev

核心数据安装

来自分类Dev

核心数据基础

来自分类Dev

Restkit的核心数据

来自分类Dev

CloudKit的核心数据

来自分类Dev

核心数据条件

来自分类Dev

测试核心数据

来自分类Dev

核心数据插入

来自分类Dev

核心数据更改本地存储观察者/通知

来自分类Dev

核心数据对象更改时更新uicollectionview

来自分类Dev

更改Xcode核心数据图视图上的缩放?

来自分类Dev

应用启动时更改核心数据

来自分类Dev

SwiftUI关于核心数据对象更改的更新视图

来自分类Dev

核心数据更改本地存储观察器/通知

来自分类Dev

核心数据更改64位整数的值

来自分类Dev

捆绑标识符更改核心数据丢失

来自分类Dev

在核心数据中更改NSOrderedSet顺序的尝试和麻烦

来自分类Dev

核心数据迁移:更改类型的持久存储

来自分类Dev

核心数据数据加密

来自分类Dev

原始核心数据与核心数据+神奇记录

来自分类Dev

Swift核心数据:核心数据中的枚举

来自分类Dev

原始核心数据与核心数据+神奇记录

来自分类Dev

Swift-将nil核心数据字符串强制转换为可选值

来自分类Dev

核心数据,从新创建的NSManagedObject填充强制性关系

来自分类Dev

如何在Swift中将核心数据查询集强制转换为可变数组?