【问题标题】:Get Firebase user information in post with different query使用不同的查询在帖子中获取 Firebase 用户信息
【发布时间】:2018-09-28 00:50:14
【问题描述】:

我的 Firebase 实时数据库中有两个表:帖子和用户。结构是:

users
-- userID
---- userName
---- userProfilePicURL

posts
-- postID
---- postTimeStamp
---- postTitle
---- postContent

现在,我在函数 loadData() 中获取数据,如下所示:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        // set all additional information and append to array

        self.collectionView?.reloadData()

    }

}

这很好用。但是,我想运行第二个查询来获取用户信息(userName、userProfilePicURL),这样也可以显示出来,因为我现在只有用户 ID。我这样做如下:

var Ref: DatabaseReference!
Ref = Database.database().reference()

Ref.child("posts").queryOrdered(byChild: "postTimeStamp").observeSingleEvent(of: .value) { (snapshot) in

    for child in snapshot.children {

        let snap = child as! DataSnapshot
        let dict = snap.value as! [String: Any]

        Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value, with: { (snapUser) in

            let valueUser = snapUser.value as! [String: Any]

            // set all additional information and append to array

            self.collectionView?.reloadData()

        }

    }

}

发生的情况是,它获取了用户信息并正确显示,但是我的第一个查询的时间顺序被破坏了。它显示同一用户的所有帖子,因此它们按 userID 而不是 postTimeStamp 排序。有没有办法解决这个问题,还是我需要完全不同的方法?

更新:到目前为止我发现了什么 当我执行 print(dict) 时,一切都以正确的顺序显示。所以错误发生在后期。当我执行 dump(self.posts) 时,这是包含所有帖子的数组,它们以错误的顺序显示。

我的猜测是,不是按照第一个查询中的请求按时间顺序附加项目,而是根据用户 ID 添加项目,因此应用程序会根据用户 ID 获取所有帖子。但是我不知道为什么会这样,我也无法在 Internet 上找到它。

【问题讨论】:

  • 错误原因是你在for循环中使用了异步方法。因此,您没有按顺序获取数据,因为从 firebase 获取数据是异步方法。您必须为用户使用另一个数组并使用 useriD 管理它
  • 感谢您的洞察力。至少现在我知道去哪里找了。如果我理解正确,我是否应该将帖子的数据提取到数组中,然后运行另一个函数来获取用户名和个人资料图片?或者我可以根据在 post 数组中发送的用户 ID 在 cellForItemAt 方法中运行它吗?
  • 您可以在单元格中运行此项目...另一种方法是您可以为用户获取新数组并使用帖子数组的 userId 从该数据中加载用户数据。
  • 非常感谢。我刚试过,它奏效了。将除 userID 之外的所有用户信息留在 post 数组之外,然后使用 post["userID"] 在 cellForItemAt 方法中运行另一个查询,返回我需要的值并相应地显示它们,直接到单元格中的元素。请添加您的解决方案作为答案,以便我可以将其标记为未来读者的解决方案。再次感谢!

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

原因:

  • 错误的原因是你在for循环中使用了异步方法。
  • 所以您没有按顺序获取数据,因为从 firebase 获取数据是 异步方法。您必须为用户使用另一个数组并使用 useriD 管理它

解决方案:

  • 您可以在单元格中为项目运行此操作...另一种方法是您可以为用户获取新数组,并使用帖子数组的 userId 从该数据中加载用户数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多