首页 > 解决方案 > 通过监视 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()
            }
        }
        
    }
}

标签: iosswiftuitableviewgoogle-cloud-firestore

解决方案


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()
    }

推荐阅读