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

Nic*_*Lui 4 ios firebase swift

我是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")
                })
            }
        }
Run Code Online (Sandbox Code Playgroud)

它是数据模型

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

}
Run Code Online (Sandbox Code Playgroud)

Jay*_*Jay 5

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

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

let ref = myRootRef.childByAppendingPath("photo_urls")
let thisFileRef = ref.childByAutoId()
thisFileRef.setValue(photoURL.absoluteString)
Run Code Online (Sandbox Code Playgroud)

并从一个字符串转到NSURL

let url = NSURL(string: urlString)!
Run Code Online (Sandbox Code Playgroud)

此外,您似乎在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)
Run Code Online (Sandbox Code Playgroud)

我建议你将这个代码作为User类的一部分

let aUser = User()
aUser.initWithStuff(displayName, email, gender etc etc
aUser.createUser()
Run Code Online (Sandbox Code Playgroud)

这确实减少了代码量并保持清洁.

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