我的项目中有大约50个同样的警告。自更新以来,我调用snapshot.value["something"] as! String
的所有函数都失败了。他们以前都曾经工作过。我甚至没有使用RemoteConfig功能。我只是想检索数据。
我的用户类示例:
init(snapshot: FIRDataSnapshot) {
firstName = snapshot.value!["firstName"] as! String
lastName = snapshot.value!["lastName"] as! String
}
函数示例(我可以提供更多示例,但基本上更相似):
func loadProfileImage(ref:FIRDatabaseReference) {
ref.observeEventType(.Value, withBlock: {snapshot in
let base64String = snapshot.value!["profileImgURL"] as! String
let decodedData = NSData(base64EncodedString: base64String, options:NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
if let decodedImage = UIImage(data: decodedData!) {
self.profileImgImageView.contentMode = .ScaleAspectFill
self.profileImgImageView.layer.cornerRadius = self.profileImgImageView.frame.size.width / 2
self.profileImgImageView.clipsToBounds = true
self.profileImgImageView.image = decodedImage as UIImage
}
})
}
应用程序运行是因为它们只是警告但警告是正确的,因为应用程序在尝试检索任何数据时就会失败。
答案 0 :(得分:5)
显然,使用Firebase / RemoteConfig pod会导致此错误。一旦我卸下了吊舱,警告就消失了。绝对把它作为一个bug。
答案 1 :(得分:2)
我遇到过同样的问题,下面的代码很完美。
使用valueForKey
代替[]
括号访问值
然后所有的价值都消失了......
例如
以下代码会发出警告......
let someArray = resource["someArrayKey"] as? NSArray
let someBool = resource["someBoolKey"] as? Bool
使用以下代码
let someArray = resource.valueForKey("someArrayKey") as? NSArray
let someBool = resource.valueForKey("someBoolKey") as? Bool
答案 2 :(得分:1)
这显然是一个错误,但暂时我觉得我找到了一个解决方法。
这就是我将信息之前拉到导入RemoteConfig pod
的方式旧代码
let databaseRef = FIRDatabase.database().referenceWithPath("Data");
_ = databaseRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
for (item) in snapshot.children {
let someValue = item.value!["someKey"] as? String
}
}
这很好用。
将pod 'Firebase/RemoteConfig'
添加到我的Podfile并运行pod install
后,发生了上述警告。
这就是我解决问题的方法。
新代码
let databaseRef = FIRDatabase.database().referenceWithPath("Data");
_ = databaseRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
if let resources = snapshot.value as? [String : AnyObject] {
for (key, obj) in resources {
if let dataObject = obj as? [String : AnyObject] {
let someValue = dataObject["someKey"] as? String
// Other data types still work
let someArray = resource["someArrayKey"] as? NSArray
let someBool = resource["someBoolKey"] as? Bool
}
}
}
}
至少对我来说,将值强制转换为String似乎可以解决问题。
这适用于如下所示的数据库:
- Data
- ObjectOne
- someKey: 'someStringValue'
- ObjectTwo
- someKey: 'anotherStringValue'
答案 3 :(得分:1)
value属性是一个id(AnyObject),您可能需要自己将它强制转换为字典。
let val = snapshot.value as! NSDictionary?
firstName = val!["firstName"] as! String
答案 4 :(得分:0)
这对我有所帮助:
if let value = snapshot.value as? [String : AnyObject] {
答案 5 :(得分:0)
这对我来说就像魅力一样,来自你只使用Firebase实时数据库的swift文件/类,删除
import Firebase
并添加
import FirebaseAuth
import FirebaseDatabase
确保不要在同一个类中导入firebase数据库和fire base远程配置,这显然是来自Google的错误