Сохранение массива в Firebase
Я использую Firebase 3.0 в качестве бэкэнда, и мне нужно сохранять всеuser.uid
в отдельном дочернем элементе, который должен быть NSArray, а затем получить этот массив с помощью цикла for!
Вот как я сохраняю свои данные: я создал отдельный класс для FIRController, который обрабатывает все хранение и извлечение базы данных и хранилища.
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!")
}
}
Как мне создать дочерний элемент в моем бэкэнде, который будет служить массивом, и как я могу получить этот массив?
Моя огненная база JSON СТРУКТУРА: -
{
"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
}
мне также нужно добавить массивno of friends
в моей базе данных (массиве). Единственная причина, по которой я использую цикл for, заключается в том, что я могу отображать данные каждого пользователя для моего пользователя (кроме него самого), используя массив userId, который я создал в моей базе данных, которые на самом деле родительский узел для каждой моей соответствующей пользовательской базы данных.
Вот как я добавляюUserId
в моей базе данных: -
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)
}
})
}
который вызывается в этой функции:
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()
}
})
})
}
})
}
Причина, почему я использовалa
переменная для решения бесконечного цикла, который он вызывал (на данный момент я знаю, что это просто взломать ...)
Открыт для любого лучшего способа справиться с этим! ..