我是Firebase的新用户,我希望存储提供者照片网址但是它出现错误'只能存储NSNumber,NSString,NSDictionary和NSArray类型的对象。'我尝试过不同类型的方法,但似乎无效,例如let profilePicUrl = profile.photoURL as String
或let 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
}
答案 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,你想将它们连接在一起。