Array in Firebase speichern
Ich verwende Firebase 3.0 als Backend und muss jedes @ speicheruser.uid
in einem separaten untergeordneten Element, das ein NSArray sein muss, und rufen Sie dieses Array dann mit einer for-Schleife ab!
So speichere ich meine Daten: Ich habe eine separate Klasse für den FIRController erstellt, die das Speichern und Abrufen von Datenbank und Speicher übernimmt.
func signUpUserWithBasicInfo(emailId : String! , password : String!, username : String!, age : String, gender : String!, backpackerType : String, info : [String : AnyObject], completionBlock : (() -> Void)){
print("fir signup did recieve")
FIRAuth.auth()?.createUserWithEmail(emailId, password: password, completion: {
user,error in
if error != nil{
print("error encountered while backend email signup Handshake : \(error)")
print("")
self.delegate.firShowAlert("Error signing you up", Message: "Please check your network or this email already exist!")
}else{
print("uploading database")
self.profilePictureUploading(info, completionBlock: {
FIRControllerClass.ref.child("UserProfile").child(user!.uid).setValue([
"username" : username,
"email" : emailId,
"age" : age,
"gender" : gender,
"password" : password,
"typeOfBackpacker" : backpackerType
])
completionBlock()
})
}
})
}
func profilePictureUploading(infoOnThePicture : [String : AnyObject],completionBlock : (()->Void)) {
if let referenceUrl = infoOnThePicture[UIImagePickerControllerReferenceURL] {
print(referenceUrl)
let assets = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl as! NSURL], options: nil)
print(assets)
let asset = assets.firstObject
print(asset)
asset?.requestContentEditingInputWithOptions(nil, completionHandler: { (ContentEditingInput, infoOfThePicture) in
let imageFile = ContentEditingInput?.fullSizeImageURL
print("imagefile : \(imageFile)")
let filePath = FIRAuth.auth()!.currentUser!.uid + "/\(Int(NSDate.timeIntervalSinceReferenceDate() * 1000))/\(imageFile!.lastPathComponent!)"
print("filePath : \(filePath)")
FIRControllerClass.storageRef.child("ProfilePictures").child(filePath).putFile(imageFile!, metadata: nil, completion: { (metadata, error) in
if error != nil{
print("error in uploading image : \(error)")
self.delegate.firShowAlert("Error Uploading Your Profile Pic", Message: "Please check your network!")
}
else{
print("metadata in : \(metadata!)")
print(metadata?.downloadURL())
print("The pic has been uploaded")
print("download url : \(metadata?.downloadURL())")
self.uploadSuccess(metadata!, storagePath: filePath)
completionBlock()
}
})
})
} else {
print("No reference URL found!")
}
}
Wie erstelle ich ein untergeordnetes Element in meinem Backend, das als Array dient, und wie kann ich dieses Array abrufen?
Meine Firebase-JSON-STRUKTUR: -
{
"UserId" : [ 1,
"Sq5EDvVOsQWkLylEx3GrBdEsIN92",
"xC4jCJmobUcqghq8C3SI1XT0UPk1",
"D8QmnOSH6vRYiMujKNXngzhdn992",
"riHjon6wknOmALwf0Z0Ri5aOMA82",
"fKqlb88MKsYCE43xy7D51qH6jqH3",
"aCgAFAGDIgWRSUu9a2aMo9HtnnD3",
"iicKACGo8RaeTSEggKPB0sU2Bme2",
"qJ2c8AcEYzVkJKLl13N92tyKnbz2"
],
"UserProfile" : {
"D8QmnOSH6vRYiMujKNXngzhdn992" : {
"age" : "12",
"email" : "[email protected]",
"gender" : "f",
"password" : "123454321",
"typeOfBackpacker" : "dummy",
"username" : "duummyy1"
},
"Sq5EDvVOsQWkLylEx3GrBdEsIN92" : {
"age" : "121",
"email" : "[email protected]",
"gender" : "gjhg",
"password" : "123454321",
"typeOfBackpacker" : "chef",
"username" : "hgfgh"
},
"aCgAFAGDIgWRSUu9a2aMo9HtnnD3" : {
"age" : "24",
"email" : "[email protected]",
"gender" : "F",
"password" : "123454321",
"typeOfBackpacker" : "Group",
"username" : "Cathy"
},
etc
}
Ich muss auch ein Array von @ hinzufügno of friends
in meiner Datenbank (Array). Der einzige Grund, warum ich for loop verwende, ist, dass ich meinem Benutzer (außer ihm selbst) die Details jedes Benutzers mit dem Array userId anzeigen kann, das ich in meiner Datenbank erstellt habe eigentlich der übergeordnete Knoten zu meiner jeweiligen Benutzerdatenbank.
Dies ist, wie ich anhängeUserId
in meiner Datenbank: -
func retrieveUserIdsArray(completionBlock : ((appendedArr : NSMutableArray) -> Void)){
var appendedArray : NSMutableArray = []
FIRControllerClass.ref.child("UserId").observeEventType(FIRDataEventType.Value, withBlock: {(snapshot) in
if let userIdDetails = snapshot.value as? NSMutableArray{
userIdDetails.addObject((FIRAuth.auth()?.currentUser?.uid)!)
appendedArray = userIdDetails
completionBlock(appendedArr: appendedArray)
}
})
}
was in dieser Funktion aufgerufen wird: -
func signUpUserWithBasicInfo(emailId : String! , password : String!, username : String!, age : String, gender : String!, backpackerType : String, info : [String : AnyObject], completionBlock : (() -> Void)){
print("fir signup did recieve")
FIRAuth.auth()?.createUserWithEmail(emailId, password: password, completion: {
user,error in
if error != nil{
print("error encountered while backend email signup Handshake : \(error)")
print("")
self.delegate.firShowAlert("Error signing you up", Message: "Please check your network or this email already exist!")
}else{
print("uploading database")
self.profilePictureUploading(info, completionBlock: {
FIRControllerClass.ref.child("UserProfile").child(user!.uid).setValue([
"username" : username,
"email" : emailId,
"age" : age,
"gender" : gender,
"password" : password,
"typeOfBackpacker" : backpackerType
])
var a = 0
self.retrieveUserIdsArray({ (appendedArr) in
a += 1
print("The appended array is : \(appendedArr)")
if a == 1{
FIRControllerClass.ref.child("UserId").setValue(appendedArr)
}else{
completionBlock()
}
})
})
}
})
}
Der Grund, warum ich @ verwendet haa
Variable ist, die Endlosschleife anzugehen, die es verursachte (ich weiß, es ist nur ein Hack, für den Moment ..)
Öffnen Sie sich für eine bessere Lösung! ..