Как получить указанное c строковое значение из ответа json от firebase - PullRequest
0 голосов
/ 22 января 2020

У меня есть эта структура данных, и я не могу извлечь правильное значение:

users
    private
        userID
            birthday: "birthdayValue"
            username: "nathan"
            firstName: "Nathan"
            etc...

Я использую функцию поиска в своем приложении для поиска пользователей по их имени пользователя в базе данных реального времени firebase:

let reference = Database.database().reference()
    if(searchText != ""){
        reference.child("users").child("private").queryOrdered(byChild:  "username").queryStarting(atValue: searchText).queryEnding(atValue: searchText + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.value is NSNull{
                    //handles errors
                    return
                }
                else{
                if let user = snapshot.value as? NSDictionary {
                    for child in user{
                        print(child.key)
                        print(child.value)
                    }
                    }
                    else{
                        //null
                    }
                }
            })

в тот момент, когда два оператора печати печатают эти два результата в консоли каждый раз, когда я ищу:

wnszfmHilqNl6PG9khWtWkKUPtF3
{
    birthday = 100;
    dateCreated = "1579543450313.94";
    description = nil;
    email = "email@email.com";
    firstName = Nathan;
    instagramLink = nil;
    lastLogin = "1579543450313.988";
    lastName = Ellis;
    profilePicURL = "url";
    twitchLink = nil;
    username = nathan;
    youtubeLink = nil;
}

Что ожидается, то печатает ID пользователя (ключ) и значение снимка как NSDictonary. Меня интересует только получение имени пользователя, ничего больше. Как мне извлечь имя пользователя из этого снимка Firebase, чтобы я мог добавить его имя пользователя в виде строки в массив для моего контроллера поиска?

Очевидно, что это должно быть Dynami c, поскольку ID пользователя всегда будет отличаться .

Нужно ли мне менять модель данных?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Ваш child.value также является словарём, поэтому вы можете получить к нему доступ:

if let valueDict = child.value as? [String: AnyObject] {
  if let username = valueDict["username"] as? String {
      // append username to results
      print(username)
  }

}
0 голосов
/ 22 января 2020

Чтобы напечатать только имя пользователя, наименьшее возможное изменение:

print(resultsLocalArray["username"])

Это будет хорошо, но все равно будет извлекать весь пользовательский узел клиенту, который использует большую пропускную способность, чем строго необходимо.

Если вам часто требуется только username пользователя или даже список username значений для пользователей, вы можете рассмотреть вопрос о сохранении узла только с именами пользователей. Так что-то вроде:

users
    userID: "nathan"

Но в вашей текущей настройке вы извлекаете узел только для одного пользователя, поэтому я сомневаюсь, что экономия полосы пропускания стоит дополнительной сложности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...