Я наблюдаю дочернее значение в firebase, после получения дочернего элемента мне нужно посмотреть на другие свойства в другой ссылке внутри первого запроса.
Это структура базы огня:
{
"chats" : {
"11-126" : {
"-LJZTRGt4lqMFjfgQqH0" : {
"attachmentType" : 6,
"body" : "kdnfif",
"date" : 1533915284798,
"delivered" : false,
"id" : "-LJZTRGt4lqMFjfgQqH0",
"loaded" : true,
"managed" : false,
"recipientId" : "11",
"selected" : false,
"senderId" : "126",
"senderName" : "Porter Project",
"sent" : true,
"valid" : true
}
},
"121-123" : {
"-LK7DHLChxxqKLvn4dRa" : {
"attachmentType" : 6,
"body" : "Hola",
"date" : 1534515029389,
"delivered" : true,
"id" : "-LK7DHLChxxqKLvn4dRa",
"loaded" : true,
"managed" : false,
"recipientId" : "123",
"selected" : false,
"senderId" : "121",
"senderName" : "Yoel",
"sent" : true,
"valid" : true
},
"-LK7ELGPbdext9hyliAh" : {
"attachment" : {
"bytesCount" : 51302,
"loaded" : true,
"managed" : false,
"name" : "IMG-20180816-WA0002.jpeg",
"url" : "https://firebasestorage.googleapis.com/v0/b/roomatch-209023.appspot.com/o/RooMatch%2FImage%2FIMG-20180816-WA0002.jpeg?alt=media&token=3baa3bdd-4280-4e6f-b190-bddd4fcffc17",
"valid" : true
},
"attachmentType" : 2,
"date" : 1534515306654,
"delivered" : false,
"id" : "-LK7ELGPbdext9hyliAh",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LK8z6O3HFp9ckfwaqnD" : {
"attachmentType" : 6,
"body" : "Un texto",
"date" : 1534544606647,
"delivered" : true,
"id" : "-LK8z6O3HFp9ckfwaqnD",
"loaded" : true,
"managed" : false,
"recipientId" : "123",
"selected" : false,
"senderId" : "121",
"senderName" : "Yoel",
"sent" : true,
"valid" : true
},
"-LKFHdpEFat-eX7xAQdu" : {
"attachmentType" : 6,
"body" : "recibido texto",
"date" : 1534650391854,
"delivered" : false,
"id" : "-LKFHdpEFat-eX7xAQdu",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRy6pZwjNnvJwx43Bn" : {
"attachmentType" : 6,
"body" : "jjj",
"date" : 1534863113383,
"delivered" : false,
"id" : "-LKRy6pZwjNnvJwx43Bn",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRze2KNk8xdgsdmq-B" : {
"attachmentType" : 6,
"body" : "gfx",
"date" : 1534863515671,
"delivered" : false,
"id" : "-LKRze2KNk8xdgsdmq-B",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRzmsc5vPBxeJdneNQ" : {
"attachment" : {
"bytesCount" : 51125,
"loaded" : true,
"managed" : false,
"name" : "IMG-20180816-WA0000.jpeg",
"url" : "https://firebasestorage.googleapis.com/v0/b/roomatch-209023.appspot.com/o/RooMatch%2FImage%2FIMG-20180816-WA0000.jpeg?alt=media&token=688f8d78-5419-4986-8b21-1e030a0b9da4",
"valid" : true
},
"attachmentType" : 2,
"date" : 1534863551851,
"delivered" : false,
"id" : "-LKRzmsc5vPBxeJdneNQ",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
}
}},
"users" : {
"121" : {
"id" : "121",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Yoel",
"nameToDisplay" : "Yoel Jimenez",
"online" : true,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"122" : {
"id" : "122",
"image" : "https://lh6.googleusercontent.com/-RX7ka61PxvY/AAAAAAAAAAI/AAAAAAAAADw/8d1DyKgF4y4/photo.jpg?sz=50",
"loaded" : true,
"managed" : false,
"name" : "QtJambiii",
"nameToDisplay" : "QtJambiii",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"123" : {
"id" : "123",
"image" : "http://www.freecashrewards.co/roomatch/api/photo/HO8rxjXhMHConKe2BG3GItNoHDZ6ENs9LqJHlZRj.jpeg",
"loaded" : true,
"managed" : false,
"name" : "Chab1",
"nameToDisplay" : "Chab1",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"124" : {
"id" : "124",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Leo",
"nameToDisplay" : "Leo",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"125" : {
"id" : "125",
"image" : "https://lh4.googleusercontent.com/-9Mi0fhtOqMQ/AAAAAAAAAAI/AAAAAAAAAAA/AAnnY7pGdlGynOdTmxd6p3MflUn0BXjjww/mo/photo.jpg?sz=50",
"loaded" : true,
"managed" : false,
"name" : "Oscar",
"nameToDisplay" : "Oscar",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"131" : {
"id" : "131",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Marta",
"nameToDisplay" : "Optional(\"Marta\") Optional(\"gr\")",
"online" : true,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
}
}
}
Я читаю для чатов всех детей, а затем, если у дочернего идентификатора есть какая-то строка, которая мне нужна, я извлекаю значения дочернего элемента, у дочернего элемента есть значение recipientId, которое является идентификатором пользователя в дочернем элементе пользователя. Мне нужно получить пользовательские значения дочернего элемента с идентификатором, равным идентификатору получателя. Я пробовал разные подходы, но все возвращают ноль.
Вот код, который я пробовал:
chatsRef.observe(.childAdded, with: { [weak self] snapshot in
if snapshot.key.contains(String(requestManager.instance.user.id!)){
if let snapshot = snapshot.children.allObjects as? [DataSnapshot]{
for snap in snapshot{
if let data = snap.value as? [String: Any]{
let id = data["id"] as! String
let message = data["body"] as? String
let senderId = data["senderId"] as! String
let recipientId = data["recipientId"] as! String
var name: String?
var preurl = ""
print("the recipient id \(recipientId)")
// Constants.refs.databaseUser.child(recipientId).observeSingleEvent(of: .value, with: {snap in
// print(snap.value as Any)
// let da = snap.value as! [String: Any]
// name = da["name"] as! String
// preurl = da["name"] as! String
// })
var url = ""
// Constants.refs.databaseUser.child(recipientId).child("name").observe(.value, with: { snap1 in
// print("")
// name = snap1.value as? String
// })
// Constants.refs.databaseUser.child(recipientId).child("image").observe(.value, with: { snap2 in
// preurl = snap2.value as! String
// })
if senderId == String(requestManager.instance.user.id!){
url = Router.baseURLString + (requestManager.instance.user.image?.path.replacingOccurrences(of: "images", with: "/photo"))!
}else{
//url = self?.rootRef.child("users").child(recipientId).value(forKey: "image") as! String
// self?.rootRef.child("users").child(recipientId).child("name").observe(.value, with: { snap in
// url = snap.value as! String
// })
url = preurl
}
код заканчивается чем-то еще, что нужно прикрепить к coreData, но вопрос не в этом. дело в том, что весь закомментированный код, который не работает, оба возвращают nil для значения имени, а для изображения - пустая строка "". Я получаю ребенка чатов с идентификатором 121-123. у какого-то дочернего элемента идентификатор получателя равен 123. Поэтому я наблюдаю ребенка-пользователя 12. но всегда получаю ноль. это поведение связано с тем, что это asyncronich и код передается до завершения запроса, или потому, что я неправильно читаю дочерний элемент пользователя. PD: как обновление Constantref выглядит так
struct Constants
{
struct refs
{
static let databaseRoot = Database.database().reference()
static let databaseChats = databaseRoot.child("chats")
static let databaseUser = databaseRoot.child("users")
}
}
проблема в том, что пользовательские данные не вставляются в чат. Дело в том, что я должен выполнить весь процесс после получения пользовательских данных из-за асинхронности в firebase. чтобы было ясно, я ищу дочерний узел для ключа, содержащего некоторые значения, если это значение совпадает, тогда мне нужно найти у пользователя конкретное дочернее значение. пользователи и дети - братья.
Вы не можете выполнить частичный поиск строки в Firebase напрямую, поэтому нет возможности поиск дочернего узла для ключа, содержащего некоторые значения. Я думаю, что есть способы сделать это лучше. Непонятно, почему вы не храните данные пользователя (например, UID) в чате, чтобы знать, кто отправил сообщение чата. Также неясно, какая проблема вызывает asych, поскольку вы уже записали данные в Firebase, поэтому вам просто нужно их получить. Возможно, вы сможете прояснить вопрос о том, что вы пытаетесь сделать и в чем заключается конкретная проблема.
Дело в том, что у чатов есть идентификатор пользователя-идентификатор пользователя в качестве ключа, а затем есть поля, такие как recipientId и senderId. с идентификатором отправки мне нужно запросить пользователей и запросить значения recipientId, чтобы получить имя и URL-адрес изображения. если я сделал все сообщение, добавленное внутри значения. я получаю все данные, которые мне нужны, но если не получаю ноль ""
Вы говорите, что дело в том, что у чатов есть идентификатор пользователя-идентификатор пользователя в качестве ключа означает, что дочерние ключи в узле / chats - это идентификатор пользователя-идентификатор пользователя? Итак, «11-126» - это идентификатор пользователя? Если да, то что это за идентификатор пользователя? Кроме того, я вижу, что у дочернего элемента этих узлов есть ключ, а затем дочерний идентификатор, который является ненужным дубликатом. Другими словами - вам не нужен дочерний идентификатор, который соответствует ключу узла, поскольку ключ всегда можно получить из snapshot.key.
Это означает, что у дочерних чатов есть и id, который является идентификатором пользователя-пользователя, так что это значение является идентификатором чатов. и в этом чате есть разговоры. найдите этот {"чаты": {"11-126": {"-LJZTRGt4lqMFjfgQqH0": {"attachmentType": 6, "body": "kdnfif", "date": 1533915284798, "доставлено": false, "id" : "-LJZTRGt4lqMFjfgQqH0", "loaded": true, "managed": false, "recipientId": "11", "selected": false, "senderId": "126", "senderName": "Porter Project}
Пожалуйста, разместите код в своем вопросе, а не в комментариях. Это очень сложно читать, поэтому обновите вопрос и давайте посмотрим.
хорошо, это не код, это просто копия структуры json, чтобы прояснить вещь id-id
Я имел в виду, что фрагменты кода / структур не должны быть в комментариях - только в вопросе - ваш там, так что все в порядке. Проблема в том, что непонятно, что представляет собой эта структура; например, есть узел «11-126», а затем «121-123»; ни один из них не является идентификатором Firebase и не имеет отношения к нему. ОДНАКО, глядя на ваш узел пользователей, кажется, что вы используете какую-то специальную систему номеров пользователей. Я бы посоветовал вам этого не делать. Используйте uid, назначенный каждому пользователю Firebase в узле / users. Это делает все намного проще; аутентификация, ссылка на пользователя в других узлах и т. д.
Я собираюсь попытаться повторить вопрос. У вас есть приложение для чата, и если пользователь B общается с пользователем A, пользователь A должен быть уведомлен об этом чате и о том, кто (их информация) общается с ним. В коде это означает, что пользователь A добавляет наблюдателя в узел чатов для любого чата, который содержит его идентификатор пользователя. Как только событие чата получено, вы хотите найти информацию о пользователе B в этом закрытии Firebase. Это правильно?





Глядя на код и если я правильно его читаю, кажется, что вы перебираете каждый из дочерних узлов в чатах. Затем каждый прочитанный узел проверяется, чтобы увидеть, соответствует ли ключ только что прочитанного снимка определенному user.id. Если намерение таково, то в этом нет необходимости. Если вы знаете конкретный путь, просто прочтите его. т.е. если вы знаете, что ищете chats / uid_5, то просто прочтите этот узел. Ключи уникальны внутри узла, поэтому внутри chats всегда будет только один / chats / uid_5.