2016-06-19 5 views
4

Ich bin neu in Firebase und ich möchte die Provider-Foto-URL speichern, aber es kommt der Fehler 'Kann nur Objekte vom Typ NSNumber, NSString, NSDictionary, und NSArray. Ich habe andere Art des Verfahrens versucht, aber es scheint nicht funktioniert zum Beispiel let profilePicUrl = profile.photoURL as String oder let profilePicUrl = NSString(NSURL: profile.photoURL)Firebase Store-Provider-Foto-URL (kann Wert des Typs NSURL nicht konvertieren?)

Es ist meine Methode,

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") 
       }) 
      } 
     } 

und es ist das Datenmodell

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 

} 

Antwort

4

Sie können nur die 4 Arten von NSObjects speichern, die Sie in Firebase erwähnt haben. Aber meistens sind Daten nur eine Zeichenkette und das Speichern von Zeichenketten ist einfach.

Unter der Annahme, dass Ihr photoURL eine tatsächliche NSURL ist, können Sie es als String speichern

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

und aus einer Zeichenfolge zu einem NSURL

let url = NSURL(string: urlString)! 

auch zu gehen, scheint es, Ihnen eine Erstellung ein neuer Benutzer in Firebase. Sie können den Code wie diese

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

var dict = [String: String]() 
dict["displayName"] = "Bill" 
dict["email"] = "[email protected]" 
dict["gender"] = "male" 
dict["photo_url"] = photoURL.absoluteString 

thisUserRef.setValue(dict) 

erheblich vereinfachen würde ich vorschlagen, dass Code Teil Ihrer Benutzerklasse zu machen, so dass Sie

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

Das ist wirklich die Menge an Code reduziert und hält sie sauber.

Wenn Sie Benutzer speichern, sollten Sie auth.uid als Schlüssel für jeden Benutzerknoten verwenden. Dies ist in v3.x schwieriger als in 2.x, aber hoffentlich wird Firebase bald repariert werden.

+0

Danke für die Beantwortung meiner Frage. Wenn ich die Daten von 'FIRAuth.auth() .currentuser' abholen möchte. Muss ich das Datendiktat zu "provider.email" usw. anstelle der spezifischen Daten ändern? –

+0

Nicht sicher, dass ich diese Frage verstehe, aber currentUser wird eine eindeutige ID, eine primäre E-Mail-Adresse, einen Namen und eine Foto-URL haben. Wenn Sie also nach einer E-Mail fragen möchten, sollten Sie sie auch im Knoten/users/uid speichern, da Sie andernfalls nicht danach suchen können. Also in meinem Beispiel war es nur ein generischer E-Mail-Platzhalter - vielleicht eine zweite E-Mail, aber Sie könnten einfach hinzufügen, was Sie wollen – Jay

1

Was sollten Sie wirklich tue ist, einen relativen Pfad zu Ihren Daten in der Firebase-Datenbank und das Präfix der absoluten URL separat zu speichern (vielleicht in Firebase in einem anderen Knoten oder woanders). Dies wird Ihnen helfen, flexibel zu sein und ohne große Sorgen in einen anderen Speicher wechseln zu können. Außerdem sollte es Ihr aktuelles Problem lösen, da Sie rohe Zeichenfolgen im Firebase speichern und dann in der App das Präfix und den relativen Pfad zusammenführen werden, um die vollständige URL zu erzeugen.

Zum Beispiel, nehmen wir an, dass Ihre URL zu einem Foto so aussieht:

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

Dann können Sie diese URL in zersetzen:

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

Und das Präfix speichern zum Beispiel In einigen Einstellungen Knoten in der Firebase-Datenbank und die relativeUrl in den Daten Ihrer Fotos.

Dann, um die vollständige URL zu erstellen, möchten Sie sie miteinander verketten.

+0

aber das Foto stammt von 'provider.photoURL', was bedeutet, dass ich die URL vom Login-Anbieter hole, wie könnte ich es aus Ihrer Antwort tun? –

Verwandte Themen