Как получить конкретное строковое значение из ответа json от firebase

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

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

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

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

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

Очевидно, он должен быть динамическим, поскольку идентификатор пользователя всегда будет другим.

Мне нужно будет изменить мою модель данных?


person Nathan    schedule 22.01.2020    source источник
comment
Какова конкретно ваша модель данных? Вы используете структуры, соответствующие Codable?   -  person koen    schedule 22.01.2020
comment
Я не использую модель данных, я просто хочу получить имя пользователя из снимка, который я получаю, и добавить его в простой массив   -  person Nathan    schedule 22.01.2020


Ответы (2)


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

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

}
person Juri Noga    schedule 22.01.2020
comment
@NathanEllis, вы уверены, что переводите child.value в словарь и подписываете его? - person Juri Noga; 22.01.2020
comment
Я предполагаю, что этот код войдет в цикл for, если да, то да. Из этого ничего не выходит. Помните, что получаемые данные моего снимка вложены в идентификатор пользователя, что может решить проблему. - person Nathan; 22.01.2020

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

print(resultsLocalArray["username"])

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

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

users
    userID: "nathan"

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

person Frank van Puffelen    schedule 22.01.2020
comment
это то, что я думал сделать, но мне нужен URL-адрес их изображения профиля вместе с ним для просмотра таблицы - person Nathan; 22.01.2020
comment
когда я делаю по-твоему, он тоже проходит как ноль? - person Nathan; 22.01.2020
comment
resultsLocalArray пока ничем не заполнен ... Я просто вынул его из своего кода, чтобы не было путаницы, по-прежнему не могу получить из него строку имени пользователя. - person Nathan; 22.01.2020