Nic*_*Lui 4 ios firebase swift
我是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")
})
}
}
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)
您只能存储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很快就能解决.
归档时间: |
|
查看次数: |
1224 次 |
最近记录: |