【发布时间】:2022-01-07 18:27:54
【问题描述】:
我正在编写一个用于从 UserDefaults 存储、检索和删除快照侦听器的包装器。但是,我遇到了一些问题。我正在尝试通过执行以下操作来存储它:
- 将
ListenerRegistration监听器编码为Data - 使用新键 + 数据更新我的 activeListeners 字典 (
[String:Data]) 属性 - 将更新的 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