Firebase商店提供商照片网址(无法转换NSURL类型的值?)

时间:2016-06-19 11:40:00

标签: ios swift firebase

我是Firebase的新用户,我希望存储提供者照片网址但是它出现错误'只能存储NSNumber,NSString,NSDictionary和NSArray类型的对象。'我尝试过不同类型的方法,但似乎无效,例如let profilePicUrl = profile.photoURL as Stringlet profilePicUrl = NSString(NSURL: profile.photoURL)

这是我的方法

func createFirebaseUser(){

        let key = ref.child("user").childByAutoId().key
        if let user = FIRAuth.auth()?.currentUser{
            for profile in user.providerData{
                let uid = profile.uid
                let providerID = profile.providerID
                let displayName = profile.displayName
                let email = ""
                let profilePicUrl = profile.photoURL


                //let userDict :[String : AnyObject] = ["name": username!"profilePicUrl": profilePicUrl!]
            let profile = Profile(uid: uid, displayName: displayName!,email: email, imageUrl: profilePicUrl)

                let childUpdates = ["/user/\(key)": profile]


                ref.updateChildValues(childUpdates, withCompletionBlock: { (error, ref) -> Void in
                    // now users exist in the database
                    print("user stored in firebase")
                })
            }
        }

它是数据模型

import Foundation

class Profile {

private var _uid: String
private var _displayName: String
private var _email: String?
private var _gender: String!
private var _city: String!
private var _imageUrl: String!

var uid: String {
    return _uid
}

var displayName: String {
    get {
        return _displayName
    }

    set {
        _displayName = newValue
    }
}

var email: String {
    get {
        return _email!
    }

    set {
        _email = newValue
    }
}

var gender: String {
    get {
        return _gender
    }

    set {
        _gender = newValue
    }
}

var city: String {
    get {
        return _city
    }

    set {
        _city = newValue
    }
}

var imageUrl: String {
    get {
        return _imageUrl
    }

    set {
        _imageUrl = newValue
    }
}

init(uid: String, displayName: String, email: String, imageUrl: String) {
    _uid = uid
    _displayName = displayName
    _email = email
    _imageUrl = imageUrl

}

2 个答案:

答案 0 :(得分:5)

您只能存储Firebase中提到的4种类型的NSObject。但是在大多数情况下,数据只是一个字符串,存储字符串很容易。

假设您的photoURL是实际的NSURL,您可以将其保存为字符串

let ref = myRootRef.childByAppendingPath("photo_urls")
let thisFileRef = ref.childByAutoId()
thisFileRef.setValue(photoURL.absoluteString)

并从字符串转到NSURL

let url = NSURL(string: urlString)!

此外,您还可以在Firebase中创建新用户。您可以像这样大大简化您的代码

let usersRef = self.myRootRef.childByAppendingPath("users")
let thisUserRef = usersRef.childByAutoId()

var dict = [String: String]()
dict["displayName"] = "Bill"
dict["email"] = "bill@thing.com"
dict["gender"] = "male"
dict["photo_url"] = photoURL.absoluteString

thisUserRef.setValue(dict)

我建议您将该代码作为User类的一部分,以便

let aUser = User()
aUser.initWithStuff(displayName, email, gender etc etc
aUser.createUser()

这确实减少了代码量并使其保持干净。

如果要存储用户,则应使用auth.uid作为每个用户节点的密钥。这在v3.x中比在2.x中更具挑战性,但希望Firebase很快就能解决。

答案 1 :(得分:1)

您应该做的是将数据的相对路径存储到Firebase数据库中,并将绝对URL的前缀分开存储(可能在某个其他节点或其他位置的Firebase中)。这将帮助您灵活变通,并且无需担心就可以切换到不同的存储。此外,它应该解决您当前的问题,因为您将在Firebase中存储原始字符串,然后在应用程序中,您将合并前缀和相对路径以生成完整的URL。

例如,我们假设您的照片网址如下:

http://storage.example.com/photos/photo1.jpg

然后,您可以将此网址分解为:

prefix = http://storage.example.com/
relativeUrl = photos/photo1.jpg

并将前缀存储在Firebase数据库的某些设置节点和照片数据中的relativeUrl中。

然后,为了构建完整的URL,你想将它们连接在一起。