Объединение запроса базы данных

Я наблюдаю дочернее значение в 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")
    }
}

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

Jay 22.08.2018 19:33

проблема в том, что пользовательские данные не вставляются в чат. Дело в том, что я должен выполнить весь процесс после получения пользовательских данных из-за асинхронности в firebase. чтобы было ясно, я ищу дочерний узел для ключа, содержащего некоторые значения, если это значение совпадает, тогда мне нужно найти у пользователя конкретное дочернее значение. пользователи и дети - братья.

Yoel Jimenez del valle 22.08.2018 21:45

Вы не можете выполнить частичный поиск строки в Firebase напрямую, поэтому нет возможности поиск дочернего узла для ключа, содержащего некоторые значения. Я думаю, что есть способы сделать это лучше. Непонятно, почему вы не храните данные пользователя (например, UID) в чате, чтобы знать, кто отправил сообщение чата. Также неясно, какая проблема вызывает asych, поскольку вы уже записали данные в Firebase, поэтому вам просто нужно их получить. Возможно, вы сможете прояснить вопрос о том, что вы пытаетесь сделать и в чем заключается конкретная проблема.

Jay 22.08.2018 23:09

Дело в том, что у чатов есть идентификатор пользователя-идентификатор пользователя в качестве ключа, а затем есть поля, такие как recipientId и senderId. с идентификатором отправки мне нужно запросить пользователей и запросить значения recipientId, чтобы получить имя и URL-адрес изображения. если я сделал все сообщение, добавленное внутри значения. я получаю все данные, которые мне нужны, но если не получаю ноль ""

Yoel Jimenez del valle 22.08.2018 23:18

Вы говорите, что дело в том, что у чатов есть идентификатор пользователя-идентификатор пользователя в качестве ключа означает, что дочерние ключи в узле / chats - это идентификатор пользователя-идентификатор пользователя? Итак, «11-126» - это идентификатор пользователя? Если да, то что это за идентификатор пользователя? Кроме того, я вижу, что у дочернего элемента этих узлов есть ключ, а затем дочерний идентификатор, который является ненужным дубликатом. Другими словами - вам не нужен дочерний идентификатор, который соответствует ключу узла, поскольку ключ всегда можно получить из snapshot.key.

Jay 24.08.2018 18:08

Это означает, что у дочерних чатов есть и 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}

Yoel Jimenez del valle 24.08.2018 22:09

Пожалуйста, разместите код в своем вопросе, а не в комментариях. Это очень сложно читать, поэтому обновите вопрос и давайте посмотрим.

Jay 24.08.2018 23:08

хорошо, это не код, это просто копия структуры json, чтобы прояснить вещь id-id

Yoel Jimenez del valle 24.08.2018 23:10

Я имел в виду, что фрагменты кода / структур не должны быть в комментариях - только в вопросе - ваш там, так что все в порядке. Проблема в том, что непонятно, что представляет собой эта структура; например, есть узел «11-126», а затем «121-123»; ни один из них не является идентификатором Firebase и не имеет отношения к нему. ОДНАКО, глядя на ваш узел пользователей, кажется, что вы используете какую-то специальную систему номеров пользователей. Я бы посоветовал вам этого не делать. Используйте uid, назначенный каждому пользователю Firebase в узле / users. Это делает все намного проще; аутентификация, ссылка на пользователя в других узлах и т. д.

Jay 24.08.2018 23:20

Я собираюсь попытаться повторить вопрос. У вас есть приложение для чата, и если пользователь B общается с пользователем A, пользователь A должен быть уведомлен об этом чате и о том, кто (их информация) общается с ним. В коде это означает, что пользователь A добавляет наблюдателя в узел чатов для любого чата, который содержит его идентификатор пользователя. Как только событие чата получено, вы хотите найти информацию о пользователе B в этом закрытии Firebase. Это правильно?

Jay 24.08.2018 23:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
65
0

Другие вопросы по теме