Swift开发:Firebase DB新增secretKey字段后触发NSUnknownKeyException崩溃
解决Firebase新增字段导致Table View崩溃的问题
嘿,这个问题我之前帮不少开发者踩过坑——你遇到的NSUnknownKeyException崩溃,本质是Firebase在解析数据库数据时,尝试给你的数据模型赋值secretKey字段,但你的模型类里根本没定义这个属性,KVC(键值编码)找不到对应的key,直接抛出了异常。
下面给你几个不同场景的解决方案,挑适合你代码结构的来用:
方案1:手动解析需要的字段(最稳妥)
如果你的数据拉取代码是直接用快照的data()字典,那完全可以只提取你Table View需要的字段,彻底避开secretKey:
// 假设你的模型是这样的 struct Item { let id: String let title: String // 只保留需要展示的属性,不用加secretKey } // 解析快照的时候 if let snapshotData = snapshot.data(), let itemId = snapshot.documentID, let itemTitle = snapshotData["title"] as? String { let newItem = Item(id: itemId, title: itemTitle) yourDataSourceArray.append(newItem) tableView.reloadData() }
这种方式完全不会触发KVC的自动映射,不管数据库加多少新字段,都不会影响现有代码。
方案2:用Codable并忽略未知键(适合用Firebase Codable支持的项目)
如果你是用Firebase的Codable解析(比如Firestore.Decoder),只需要开启忽略未知键的选项就行:
// 你的模型遵循Codable,只定义需要的字段 struct Item: Codable { let id: String let title: String } // 解析快照时 let decoder = Firestore.Decoder() // 关键:开启忽略未知键 decoder.ignoreUnknownKeys = true do { if let data = snapshot.data() { let item = try decoder.decode(Item.self, from: data) yourDataSourceArray.append(item) tableView.reloadData() } } catch { print("解析错误:\(error.localizedDescription)") }
这样Firebase解码时会自动跳过模型里没有定义的字段(比如secretKey),不会崩溃。
方案3:重写KVC的未知键处理方法(适合用KVC赋值的老代码)
如果你的代码是用setValuesForKeys(_:)这类KVC方法直接赋值,那可以在模型类里重写setValue(_:forUndefinedKey:)来忽略未知键:
class Item: NSObject { @objc var id: String? @objc var title: String? // 重写这个方法,忽略未知的key override func setValue(_ value: Any?, forUndefinedKey key: String) { // 可以专门针对secretKey做处理,或者直接忽略所有未知键 if key == "secretKey" { return } // 其他未知键可以选择抛出错误或者忽略,这里直接忽略 super.setValue(value, forUndefinedKey: key) } }
这样当Firebase尝试给secretKey赋值时,方法会直接跳过,不会触发崩溃。
方案4:给模型添加空的secretKey属性(最偷懒的办法)
如果不想改解析逻辑,也可以在模型里加一个不需要用到的secretKey属性,让KVC能找到对应的key:
// 不管是struct还是class,加个可选属性就行 struct Item { let id: String let title: String var secretKey: String? // 仅为了匹配数据库字段,不用在Table View里展示 }
这种方法简单粗暴,但以后数据库再加新字段可能又会崩溃,所以不如前面几种方案稳妥。
内容的提问来源于stack exchange,提问作者Oliver Ferris
相关产品推荐
相关产品推荐

