will used tool thus tagmanager tag not manager google found developers and ios arrays firebase swift2 firebase-database

ios - tool - tag manager is not found and thus will not be used



Guardando Matriz en Firebase (1)

Estoy usando Firebase 3.0 como mi backend, y necesito guardar cada user.uid mis user.uid en un elemento secundario separado que debe ser un NSArray, y luego recuperar esa matriz usando un bucle for.

Así es como estoy guardando mis datos: he creado una clase separada para el FIRController que se encarga de todo el almacenamiento y la recuperación de la base de datos y el almacenamiento.

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

¿Cómo crearía un niño en mi backend que serviría como matriz, y cómo puedo recuperar esa matriz?

Mi firebase JSON ESTRUCTURE: -

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

también necesito agregar una matriz de no of friends en mi base de datos (matriz). La única razón por la que estoy usando for loop es para poder mostrar los detalles de cada usuario a mi usuario (aparte de él mismo) usando la matriz userId que he creado en mi base de datos, que en realidad son el nodo padre de cada una de mis respectivas bases de datos de usuarios.

Así es como UserId en mi base de datos:

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

que se llama en esta función: -

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

La razón por la que he usado a variable es abordar el ciclo infinito que estaba causando (sé que es solo un truco, por ahora ...)

Abierto a cualquier mejor manera de abordar esto!


La matriz puede ser un desafío en Firebase ya que no se puede acceder directamente a los elementos individuales ni modificarlos. O lee toda la matriz o escribe toda la matriz.

Sugeriría cambiar la estructura para que coincida mejor con los datos que desea y evitar la matriz por completo:

"UserProfile" : { "D8QmnOSH6vRYiMujKNXngzhdn992" : { "age" : "12", "email" : "[email protected]", "gender" : "f", "password" : "123454321", "typeOfBackpacker" : "dummy", "username" : "duummyy1" "friend_count": 10 "friend_of" "aCgAFAGDIgWRSUu9a2aMo9HtnnD3": true },

luego, una simple consulta profunda devolverá todo lo que necesita (Firebase v2)

let myUid = "aCgAFAGDIgWRSUu9a2aMo9HtnnD3" let path = ("friend_of//(myUid)") // equals friend_of/aCgAFAGDIgWRSUu9a2aMo9HtnnD3 var userIdArray = [String]() userProfileRef.queryOrderedByChild(path) .queryEqualToValue(true) .observeSingleEventOfType(.Value, withBlock: { snapshot in for child in snapshot.children { let userId = child.key as String userIdArray.append(userId) } //loop is done, now we have an array of userIds that are friends })

El código devuelve a cada usuario que es amigo mío (myUid)

También agregué un nodo de "conteo de amigos" que simplemente cuenta el número de amigos de esos usuarios. Cuando se agrega un amigo, incremente el valor, cuando se elimine la disminución. Es un rápido

myUid.child("friend_count").setValue(updated_count)

Este código también evita los bucles, las devoluciones de llamada y los bloques de finalización adicionales porque confía en Firebase para obtener los datos, y nos avisa cuando termina.

Si realmente quieres leer un nodo de matriz (no recomendado)

let myRef = self.myRootRef.child("array_node") myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in let a = snapshot.value as! NSArray print(a) //a an NSArray let b = (a as Array).filter {$0 is String} print(b) //b is a Swift Array print( b[1] ) })