来自'FIRRemoteConfigValue!'不相关的类型'String'总是失败

时间:2016-05-19 23:09:30

标签: ios swift firebase firebase-realtime-database

我的项目中有大约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
            }
        })
    }

应用程序运行是因为它们只是警告但警告是正确的,因为应用程序在尝试检索任何数据时就会失败。

6 个答案:

答案 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的错误