ios - 通过监视 DB 中的更改来寻找更新 tableview 时的最佳实践
问题描述
我对此有些陌生,这是我关于stackoverflow的第一个问题。提前感谢您的帮助,如果我的格式很糟糕,请多多包涵
我的应用程序中有多个视图(所有视图都使用 tableview 子视图显示数据)需要在数据库(Firestore)上的数据更改时自动更新,即另一个用户更新数据。
我找到了一种行之有效的方法,但我想问问社区是否有更好的方法。
目前,我正在创建一个 timeInterval 为 2 的 Timer 对象。在该时间间隔内,计时器查询数据库并根据更新的数据检查存储的数据样本。如果这两个值不同,我会运行 viewDidLoad,其中包含我的原始查询、tableView.reloadData() 等。
任何建议或肯定都会非常有用。
var timer = Timer()
var oldChallengesArray = [String]()
var newChallengesArray = [String]()
override func viewDidLoad() {
super.viewDidLoad()
//set tableview delegate
mainTableView.delegate = self
mainTableView.dataSource = self
//set challengesmodel delegate
challengesModel.delegate = self
//get challenges
DispatchQueue.main.async {
self.challengesModel.getChallenges(accepted: true, challengeDenied: false, incomingChallenges: false, matchOver: false)
self.mainTableView.reloadData()
}
scheduledTimerWithTimeInterval()
}
func scheduledTimerWithTimeInterval(){
// Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds
timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.updateTableView), userInfo: nil, repeats: true)
}
@objc func updateTableView(){
ChallengeService.getAllUserChallengeIDs(accepted: true, challengeDenied: false, matchOver: false) { (array) in
if array.isEmpty {
return
} else {
self.newChallengesArray = array
if self.oldChallengesArray != self.newChallengesArray {
self.oldChallengesArray = self.newChallengesArray
self.newChallengesArray.removeAll()
self.viewDidLoad()
}
}
}
}
解决方案
Firestore 是一个“实时数据库”,这意味着数据库会在数据发生更改时向您发出警告。为了实现这一点,应用程序需要订阅数据库中的相关更改。下面的示例代码可以在这里找到:
db.collection("cities").document("SF")
.addSnapshotListener { documentSnapshot, error in
guard let document = documentSnapshot else {
print("Error fetching document: \(error!)")
return
}
guard let data = document.data() else {
print("Document data was empty.")
return
}
print("Current data: \(data)")
}
另外,我想指出调用viewDidLoad是不正确的,你永远不应该自己调用viewDidLoad,创建一个函数来更新数据。像这样的东西:
DispatchQueue.main.async {
self.mainTableView.reloadData()
}
推荐阅读
- batch-file - 批量将文件移动到不包括父目录的子目录中
- java - 如何将字符串添加到 TextView / ScrollView?
- scikit-learn - ScikitLearn 的 MLPClasssifier 在输出层使用什么样的激活?
- powerbi - 按相同 ID 分组的 Power BI Sum 单元格
- angular - Angular 表单验证 - 获取所有验证错误
- php - 将数据从 CSV 读入单个数组或单个 json
- java - 从侦听器列表中删除侦听器
- excel - 尽管有所有数据,VLOOKUP 仅返回一些结果 [Office 365]
- django - 从 Django views.py 返回 HttpResponse 对象和渲染页面
- azure-active-directory - 在 Keycloack 和电子邮件属性中将 Azure AD 配置为身份提供程序 OIC