swift - Firebase observe.value 不附加数组
问题描述
我有一个我试图调用的函数,它从firebase收集我的所有用户,然后通过查看每个用户并检查一个子节点将它们分成两组。例如,如果子节点是一个,它们将被放入第一组。如果他们的子节点是两个,那么他们将被放入第 2 组。这是我正在使用的当前代码。
var allUsersArray = [User]()
var macroUsersArray = [User]()
var microUsersArray = [User]()
override func viewDidLoad() {
super.viewDidLoad()
loadAllUsersAndPopulateArray()
}
func loadAllUsersAndPopulateArray() {
let ref = Database.database().reference().child("Users")
ref.observeSingleEvent(of: .value, with: { snapshot in
let allUsersSnapshot = snapshot.children.allObjects as! [DataSnapshot]
for userSnap in allUsersSnapshot {
let user = User(from: userSnap)
self.allUsersArray.append(user!)
}
self.macroUsersArray = self.allUsersArray.filter { $0.Tag == "Macro" }
self.microUsersArray = self.allUsersArray.filter { $0.Tag == "Micro" }
// print(A)
print(self.allUsersArray)
self.observeChangeInUserProperty()
})
//print(B)
print(self.allUsersArray)
}
func observeChangeInUserProperty() {
let ref = Database.database().reference().child("Users")
ref.observe(.childChanged, with: { snapshot in
let key = snapshot.key
let tag = snapshot.childSnapshot(forPath: "Tag").value as! String // ! = never optional
//get the user from the allUsersArray by its key
if let user = self.allUsersArray.first(where: { $0.Tag == key }) {
if user.Tag != tag { //if the tag changed, handle it
user.Tag = tag //update the allUsersArray
if tag == "Macro" { //if the new tag is Macro remove the user from the Micro array
if let userIndex = self.microUsersArray.firstIndex(where: { $0.Tag == key }) {
self.microUsersArray.remove(at: userIndex)
self.macroUsersArray.append(user) //add user to macro array
}
} else { //new type is micro so remove from macro array
if let userIndex = self.macroUsersArray.firstIndex(where: { $0.Tag == key }) {
self.macroUsersArray.remove(at: userIndex)
self.microUsersArray.append(user)
}
}
//reload the tableviews to reflect the changes
self.tableView.reloadData()
self.microTableView.reloadData()
}
}
})
}
这是用户类的样子:
import UIKit
import Firebase
class User: NSObject {
var Name: String?
var Email: String?
var UID: String?
var Tag: String?
init?(from snapshot: DataSnapshot) {
let dictionary = snapshot.value as? [String: Any]
self.Name = dictionary!["Name"] as? String
self.Email = dictionary!["Email"] as? String
self.UID = dictionary!["UID"] as? String
self.Tag = dictionary!["Tag"] as? String
}
}
每当我从 loadAllUsersAndPopulateArray() 中的 ref.observeSingleEvent{} 中打印(self.allUsersArray)时,我都可以看到用户列表。当我在 func loadAllUsersAndPopulateArray() 中移动 print(self.allUsersArray) 时,我得到一个空数组。当我在 viewDidLoad() 中打印数组时,我也会得到空数组。我真的需要弄清楚如何永久附加这些数组,这样我就可以开始设置表了。
编辑:
每当我 print(A) 时,我都会得到相应用户的数组。
每当我 print(B) 得到空数组时,这意味着数组仍未被附加。
解决方案
推荐阅读
- azure - 当前事务无法提交,也无法回滚到保存点。回滚整个事务
- authentication - 如何在asp.net web api中使用授权按钮设置swagger API登录?
- angular - 如何为 Angular 项目“启用 sonarqube 中的前端代码覆盖”
- html - 如何消除所有设备上输入文本和按钮之间的差距?
- c# - 具有未处理异常的 Nlog 事件属性的 .Net Core Web Api
- amazon-s3 - Cloudfront 分发无法在一个堆栈中加载子目录,但在另一个堆栈中工作
- mongodb - 如何在 mongodb 中找到文档到文档数组中
- vue.js - 如何渲染存储在vuex中的数组
- python - 将原始索引替换为字典和数据框中的新索引?
- android - 设备重启后应用程序自动启动不起作用(android 9)