目前,我的数据在firebase中的结构如下:
我想从以下选项卡的子节点中获取随机的autoID,并以多选格式将其显示为选项,使其看起来像这样(其中选项A,B,C,D是随机的,但不一样):
Image: How the app should look
我是Swift和Firebase的新手,所以想知道您是否可以通过我可以写的代码来帮助我:
输入显示用户关注谁的子节点
从列表中获取4个随机AutoID,并将其显示为选项A,B,C,D
允许将选项设置为UIButton(或类似按钮),以便我可以将此屏幕发送给被选中的用户(作为通知)
在UIImageview上显示4个用户个人资料图片(profileImageUrl),以便您可以滚动浏览它们(-这是一个额外的步骤,但也希望能获得帮助)
我希望这是有道理的
非常感谢:)
答案 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
等