【问题标题】:How to get a specific string value out of a json response from firebase如何从firebase的json响应中获取特定的字符串值
【发布时间】:2020-05-09 00:40:18
【问题描述】:

我有这个数据结构,我无法提取正确的值:

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 快照中提取用户名,以便我可以将他们的用户名作为字符串添加到我的搜索控制器的数组中?

显然它需要是动态的,因为用户 ID 总是不同的。

我需要更改我的数据模型吗?

【问题讨论】:

  • 你的数据模型到底是什么?您是否使用符合 Codable 的结构?
  • 我没有使用数据模型,我只是想从收到的快照中获取用户名并将其添加到一个简单的数组中

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

您的child.value 似乎也是一本字典,因此您可以通过以下方式访问它:

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

}

【讨论】:

  • @NathanEllis 您确定要将 child.value 转换为字典并为其下标吗?
  • 我假设代码将进入 for 循环,如果是,那么是的。什么都没有。记住我出来的快照数据嵌套在用户 ID 中,这很可能是问题
【解决方案2】:

要仅打印用户名,最小可能的更改是:

print(resultsLocalArray["username"])

这很好,但仍会将整个用户节点检索到客户端,这会使用比严格需要的带宽更多的带宽。

如果您发现自己经常只需要用户的username,或者甚至可能需要跨用户的username 值列表,您可能需要考虑存储仅包含用户名的节点。所以像:

users
    userID: "nathan"

但在您当前的设置中,您只能检索单个用户的节点,所以我怀疑节省的带宽是否值得额外的复杂性。

【讨论】:

  • 这就是我想做的,但我需要他们的个人资料图片网址以及表格视图
  • 当我按照你的方式进行时,它也会作为 nil 传递?
  • resultsLocalArray 尚未填充任何内容...我只是将代码取出以减少混乱,但仍无法从中检索用户名字符串。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 2020-12-02
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多