【问题标题】:Reload TableView More Than Once Swift多次重新加载 TableView Swift
【发布时间】:2018-08-19 09:53:47
【问题描述】:

我试图不止一次地快速重新加载表格视图。如下代码所示,最初,在 0.5 秒后,tableview “重新加载”,并且从 Firebase 加载 tableview 的所有元素;但是,5.0 秒后,当调用 runTimer() 时,tableview 不会重新加载。本质上,每次在 Firebase 中更新某些内容时,我都试图“重新加载”数据,但似乎没有任何效果。感谢您对解决此问题的任何帮助,因为我已经查看了所有内容并且没有任何运气。

 override func viewDidLoad() {
            super.viewDidLoad()

            checkFireBase()

            tableViewResults.delegate = self
            tableViewResults.dataSource = self

            let nibName = UINib(nibName: "TableViewCell", bundle: nil)
            tableViewResults.register(nibName, forCellReuseIdentifier: "tableCell")

            txtsearchBar.addTarget(self, action: #selector(searchRecords(_ :)), for: .editingChanged)

            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {

                self.tableViewResults.reloadData()

            }

           runTimer()
        }

   func runTimer(){
        self.timer = Timer(fire: Date(), interval: 5.0, repeats: true, block: { (Timer) in
            self.vehicleArray.removeAll()
            DispatchQueue.main.async {
                self.checkFireBase()

            }
        })

        RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
        self.tableViewResults.reloadData()

    }

【问题讨论】:

  • 你怎么知道数据没有重新加载。您似乎试图每 5 秒重新加载 t,但如果数据确实如此。或者改变它看起来还是一样的。
  • @Chris 我可以通过放入 print 语句看到它发生了变化,我看到它正在从 firebase 获取更新的值,但 tableview 没有重新加载并显示正确/更新的信息跨度>
  • 好的,感谢更新
  • 我有一个想法,将 reload tableView 调用放在 checkFirebase() 方法的末尾(或计时器块内)。目前,当runTimer() 被调用时,重载代码会被调用一次,但不会被计时器的代码块调用。
  • @rengineer 你这里不需要计时器,你应该使用firebase的实时监听器,见下面我的回答

标签: ios swift uitableview firebase timer


【解决方案1】:

您可以使用 firebase 提供的侦听器,而不是在此处使用计时器,这些侦听器会在 Firebase 实时数据库中的数据更新时自动调用。看这个链接:

https://firebase.google.com/docs/database/ios/lists-of-data

【讨论】:

  • 帮助某人感觉很棒:)
【解决方案2】:

您已澄清您的 checkFirebase() 方法正在更新您的数据。然而self.tableViewResults.reloadData() 只被调用一次(当runTimer() 被调用时)并且不会被定时器的代码块调用。

要么将self.tableViewResults.reloadData() 放在你的checkFirebase() 方法中,要么放在计时器的块中。这将在每次触发计时器时重新加载 tableView。

【讨论】:

    【解决方案3】:

    计时器将执行完成处理程序或完成块中存在的代码。

    所以你的表更新调用self.tableViewResults.reloadData() runTimer() 函数中的调用只会在你调用的时候执行 功能。 要更新表格,您需要在以下时间重新加载表格 你更新你的数据源。

    试试下面的

    func runTimer(){
            self.timer = Timer(fire: Date(), interval: 5.0, repeats: true, block: { (Timer) in
                self.vehicleArray.removeAll()
                DispatchQueue.main.async {
                    self.checkFireBase()
    
                }
            })
    
            RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
            self.tableViewResults.reloadData()
    
        }
    
        func checkFireBase(){
            //Fetch the latest data and update the data Source of your Table view
             self.tableViewResults.reloadData()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多