【问题标题】:How to store a Firebase ListenerRegistration object in UserDefaults?如何在 UserDefaults 中存储 Firebase ListenerRegistration 对象?
【发布时间】:2022-01-07 18:27:54
【问题描述】:

我正在编写一个用于从 UserDefaults 存储、检索和删除快照侦听器的包装器。但是,我遇到了一些问题。我正在尝试通过执行以下操作来存储它:

  1. ListenerRegistration监听器编码为Data
  2. 使用新键 + 数据更新我的 activeListeners 字典 ([String:Data]) 属性
  3. 将更新的 activeListeners 字典存储在 UserDefaults 中
func storeListener(listener: ListenerRegistration, for objectId: String, atPath path: AppAPI.Path) {
        let key = formatKeyForListener(objectId: objectId, path: path)
        do {
            let encodedListenerData = try NSKeyedArchiver.archivedData(withRootObject: listener, requiringSecureCoding: false)
            activeListeners.updateValue(encodedListenerData, forKey: key)
            UserDefaults.standard.set(activeListeners, forKey: Strings.listenersKey)
            UserDefaults.standard.synchronize()
        } catch {
            print("Error encoding listener with key: \(key)\nError: \(error.localizedDescription).")
        }
    }

很遗憾,我看到以下错误:Error: The data couldn’t be written because it isn’t in the correct format...

【问题讨论】:

  • 即使它是可存储的,UserDefaults 似乎也不太适合这种情况——UserDefaults 对于启动之间的持久性最有用,这与 ListenerRegistrations 无关。也许这是一个 XY 问题,而您试图通过这样做来解决不同的架构问题?
  • 啊,我明白了,听众们,不要坚持吗?那么如果应用被杀死,它们就结束了?
  • 是的,如果应用被杀死,监听器结束
  • 用户默认设置不是一个好地方。此外,您为什么要尝试存储侦听器?这些通常是动态创建的,实际上不需要“存储”。用例是什么?你能用更多细节更新问题(编辑它)吗?

标签: swift firebase google-cloud-firestore nskeyedarchiver userdefaults


【解决方案1】:

Firestore 侦听器不会在应用启动之间持续存在。当应用程序进程以任何方式被杀死时,所有的侦听器都会消失,并且在应用程序再次启动时不会回来。如果您希望监听器在下次启动时返回,您将需要编写代码来再次建立这些监听器,并决定如何处理它们生成的任何文档。如果这是您想要的,那么您应该集中精力找出如何在存储系统中表示这些侦听器(可能只是一个集合或文档路径就可以了),并在启动时重新构建它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多