ios - iOS:如何获取和洗牌存储在 Firebase 子节点中的用户的 autoID 数据?
问题描述
目前我的数据在firebase中的结构如下:
我想从以下选项卡的子节点中获取一个随机 autoID,并将其作为一个选项以多项选择格式呈现,使其看起来像这样(其中选项 A、B、C、D 是随机的但不相同):
我是 swift 和 firebase 的新手,所以想知道您是否可以帮助我编写可以写入的代码:
输入显示用户正在关注的人的子节点
从列表中抓取 4 个随机 AutoID,并将它们显示为选项 A、B、C、D
允许选项为 UIButtons(或类似),以便我可以将此屏幕发送给被选中的用户(作为通知)
在 UIImageview 上显示 4 个用户的个人资料图片 (profileImageUrl),以便您可以滚动浏览它们(- 这是一个额外的步骤,但也希望得到帮助)
我希望这是有道理的,
提前非常感谢:)
解决方案
问题中有几个问题,所以让我们解决一个问题。
如何从 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
推荐阅读
- c++ - 针对不同语言的不同 INTERFACE 编译器选项
- hadoop - 在 Apache Atlas VIA Rest API 中删除关系
- javascript - twitch embed 顶部的 React 组件不会触发点击事件
- javascript - 如何让 child_process.exec() 运行 .bat 文件?
- javascript - 如何将 ipcRenderer 从 Electron 添加到 Angular?预加载脚本中的附加变量未定义
- java - ThreadPoolExecutor 的实例是如何管理的
- docker - 在本地机器上运行 `docker-compose up` 时出现 FileNotFound 错误
- python - 如果给定的字符串与字典中的键匹配,如何返回键的值
- ruby-on-rails - Rails Action cable:如何将房间 ID 从客户端 channel.js 安全地传递到服务器 channel.rb
- java - 在 Spring 中允许带有重定向的帧显示