swift - 如何使用 Firebase 更新 CollectionView 模型?
问题描述
我正在尝试初始化我的集合视图模型,该模型包含一个 [Users] 列表,其中包含一个包含数据的 firebase snap。
这是集合视图模型代码:
typealias JSON = [String:Any]
class HomeDataSource: Datasource {
var users: [User]
init?(with snapshot:DataSnapshot) {
var users = [User]()
guard let snapDict = snapshot.value as? [String: [String:Any]] else {return nil}
for snap in snapDict {
guard let user = User(dict: snap.value) else {continue}
users.append(user)
}
self.users = users
}
}
用户模型:
struct User {
let name: String
let username: String
init?(dict: JSON) {
guard let name = dict["name"] as? String,
let email = dict["email"] as? String
else {return nil}
self.name = name
self.username = email
}
}
Firebase 快照:
Snap (users) {
8CVeHMNHI6hZAWj1zhGHEjPwYYz1 = {
email = "Silviu@isidors.sjsj";
name = Bshdjdj;
};
9CuqgR4Es7TOPPJQEpSnQXlfYnm1 = {
email = "Test@silviu.com";
name = "Test@silviu.com";
};
DBqGWlpdJKME570euqUz2rqI5Z83 = {
email = "Test@test.test";
name = Test;
};
}
获取功能:
func fetchUser() {
let ref = Database.database().reference().child("users")
ref.observe(.childAdded, with: { (snapshot) in
let user = User(dict: snapshot.value as! JSON)
self.users.append(user!)
print(self.users)
let new = HomeDataSource(with: snapshot)
print(new)
DispatchQueue.main.async(execute: {
self.datasource = new
self.collectionView?.reloadData()
})
}, withCancel: nil)
}
现在,我从 Firebase 获得了一系列用户,但是我的集合视图不会更新。
我的问题是我应该如何更新我的集合视图模型和获取函数,以便它可以从 Firebase 获取数据并正确填充集合视图?
解决方案
所以问题是我的目标节点。删除“ child("users")
”表单获取功能,并以 uids 为目标整个用户节点。然后我在将它投射到 [String:[String:Any]] 时循环了 snapshot.value,因为每个snapshot.value
看起来像这样(key: "vijwUkzAlbgcqjAammfy0JuVMB33", value: ["name": Silviu, "email": Office@isidors.com])
最后,我像这样更新了 HomeDataShource 类:
class HomeDataSource: Datasource {
var users: [User]
init(with snapshot:DataSnapshot) {
var users = [User]()
let snapDict = snapshot.value as? [String:[String:Any]]
for snap in snapDict! {
guard let user = User(snap: snap.value) else {continue}
users.append(user)
}
self.users = users
}
推荐阅读
- python - matplotlib - 绘制多条线时出现奇怪的 y 轴
- amazon-web-services - 使用未链接到角色的 AWS CloudFormation 创建 CloudWatch 规则
- node.js - NPM 多次安装错误
- python-3.7 - 在 Django 管理表单中使用 MultiValueField 和 MultiWidget 获取范围
- html - 如何防止第二个孩子包裹
- c++ - Xcode 中包含的 C++ 头文件和源代码的静默警告
- java - 如何在带有 JavaFX 的 mac 顶部工具栏上有一个菜单?
- database - Flutter sqflite 打开现有数据库
- c# - 在列表中选择许多 XML 节点
- express - 如何在 socket.io 2.0.3 中获取会话 ID?