首页 > 解决方案 > iOS:如何获取和洗牌存储在 Firebase 子节点中的用户的 autoID 数据?

问题描述

目前我的数据在firebase中的结构如下:

图片:Firebase 结构

我想从以下选项卡的子节点中获取一个随机 autoID,并将其作为一个选项以多项选择格式呈现,使其看起来像这样(其中选项 A、B、C、D 是随机的但不相同):

图片:应用程序的外观

我是 swift 和 firebase 的新手,所以想知道您是否可以帮助我编写可以写入的代码:

  1. 输入显示用户正在关注的人的子节点

  2. 从列表中抓取 4 个随机 AutoID,并将它们显示为选项 A、B、C、D

  3. 允许选项为 UIButtons(或类似),以便我可以将此屏幕发送给被选中的用户(作为通知)

  4. 在 UIImageview 上显示 4 个用户的个人资料图片 (profileImageUrl),以便您可以滚动浏览它们(- 这是一个额外的步骤,但也希望得到帮助)

我希望这是有道理的,

提前非常感谢:)

标签: iosswiftiphonefirebasefirebase-realtime-database

解决方案


问题中有几个问题,所以让我们解决一个问题。

如何从 Firebase 实时数据库中选择一个随机节点。好吧,您不要使用 Firebase API 来做这件事,因为 Firebase 不提供该功能。但是,您仍然可以这样做。

首先让我们从一个典型的用户节点开始

users
  uid_0
    name: "Frank"
  uid_1
    name: "Leroy"
  uid_2
    name: "Henry"
  uid_3
    name: "Fred"

因此,如果这是用户节点,您可以将其用于此解决方案。但是,许多用户节点中存储了许多其他数据 - 要选择一个随机节点,我们并不关心这些数据。我们所做的是创建另一个仅包含节点密钥的节点 - 即使有成千上万的用户,它也会保持很小

user_keys
   uid_0: true
   uid_1: true
   uid_2: true
   uid_3: true

然后,为了选择一个随机节点,我们使用 .value 加载所有用户键,遍历它们以将键加载到一个数组中,然后使用 Swift 4 随机数生成器选择一些我们加载到另一个数组中的键。

然后我们遍历该数组以从 Firebase 中获取实际的用户节点。我们也不希望重复,所以当我们从数组中选择节点时,我们会删除这些节点,这样它们就不会再次被选中。这是一个选择 3 个随机节点、检索用户数据并打印用户名的函数。

func getThreeRandomNodesAndPrintUserName() {

    var myKeyArray = [String]()

    let ref = self.ref.child("user_keys")

    //retreives all nodes in the user_keys node
    ref.observeSingleEvent(of: .value, with: { snapshot in

        for child in snapshot.children { //build the array of keys
            let snap = child as! DataSnapshot
            let key = snap.key
            myKeyArray.append(key)
        }

        var randomKeyArray = [String]()

        for _ in 0...2 { //will iterate three times
            let count = myKeyArray.count //get the number of elements
            let randomInt = Int.random(in: 0..<count) //get a random index for the array
            let randomUserKey = myKeyArray[randomInt]
            randomKeyArray.append(randomUserKey)
            myKeyArray.remove(at: randomInt) //remove that object so it's not selected again
        }

        let numberOfKeys = randomKeyArray.count

        for i in 0..<numberOfKeys {
            let thisUserKey = randomKeyArray[i]
            let userRef = self.ref.child("users").child(thisUserKey)
            userRef.observeSingleEvent(of: .value, with: { snapshot in
                let name = snapshot.childSnapshot(forPath: "name").value as! String
                print(name)
            })
        }
    })
}

然后只需调用该函数将打印三个随机用户名

self.getThreeRandomNodesAndPrintUserName()

和第一次运行的输出

Fred
Frank
Henry

然后第二次运行

Henry
Leroy
Fred

ETC


推荐阅读