iOS:如何获取和改组存储在Firebase的childnode中的用户的autoID数据?

时间:2019-02-20 13:03:08

标签: ios swift iphone firebase firebase-realtime-database

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

Image: Firebase structure

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

Image: How the app should look

我是Swift和Firebase的新手,所以想知道您是否可以通过我可以写的代码来帮助我:

  1. 输入显示用户关注谁的子节点

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

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

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

我希望这是有道理的

非常感谢:)

1 个答案:

答案 0 :(得分:1)

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

如何从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