【问题标题】:Firestore into TableView [Swift]Firestore 到 TableView [Swift]
【发布时间】:2019-02-25 13:02:29
【问题描述】:

我已经看到了:Swift UITableView reloadData in a closure,但它仍然不起作用。这就是为什么我要为此创建一个新线程。

我正在尝试将 Firestore 数据插入自定义表格视图。但是当我打印它返回的数字时(在控制台中):

“MyDogwalk.listTxt”

tableview 上没有显示任何数据。

我想所有这些都是相关的。 (我也有 2 个类,带有 init 等)

class HistoryViewController: UIViewController {

    //Tableview
    @IBOutlet weak var tableView: UITableView!

    let db = Firestore.firestore()

    var list: [listTxt] = []


    override func viewDidLoad()
    {
        super.viewDidLoad()

        list = createArray()

        tableView.delegate = self
        tableView.dataSource = self
    }

    func createArray() -> [listTxt]
    {
        var tempTxt: [listTxt] = []

        //Authentication
        let authentication = Auth.auth().currentUser?.uid

        //Choosing collection
        db.collection("rastad").document(authentication!).collection("promenad").getDocuments()
            { (QuerySnapshot, err) in
                if err != nil
                {
                    print("Error getting documents: \(String(describing: err))");
                }
                else
                {
                    //For-loop
                    for _ in QuerySnapshot!.documents
                    {
                        self.list.removeAll()
                        let document = QuerySnapshot!.documents.first
                        let data = document!.data()
                        data.forEach { (item) in

                            let data1 = data["Dog"] as? String
                            let data2 = data["Person"] as? String
                            let data3 = data["What"] as? String
                            let data4 = data["Date"] as? String
                            let data5 = data["Time"] as? String


                            let txt = listTxt(dog: data1!, person: data2!, action: data3!, time: data4!, date: data5!)
                            print(txt)

                            tempTxt.append(txt)
                        }

                    }
                    self.tableView.reloadData()
                }
        }

        //return tempTxt
        return list
    }
}

extension HistoryViewController: UITableViewDelegate, UITableViewDataSource
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return list.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let listPath = list[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! HistoryCell

        cell.setCell(list: listPath)

        return cell
    }


}

而且.. 为什么这被否决了?我得到了一个实际上适用于这个案例的答案,而且这个问题足够详细,人们可以理解,不是吗?

【问题讨论】:

  • 在主队列中重新加载您的tableView
  • @Dharmesh “主队列”在哪里,我是 swift 新手,所以我有点迷路了哈哈
  • @Dharmesh 非常感谢您的帮助,已解决。 :)

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

createArray() 方法运行异步代码,并填充tempTxt。但是你在异步代码运行之前返回tempTxt。所以不是从createArray方法返回并将其值设置为self.list,只需在方法本身中执行:

self.list = tempTxt
self.tableView.reloadData()

您正在迭代 documents,但始终使用 documents.first 的数据。试试这个:

self.list.removeAll()

for document in QuerySnapshot!.documents {
  let data = document!.data()
  data.forEach { (item) in

  let data1 = data["Dog"] as? String
  let data2 = data["Person"] as? String
  let data3 = data["What"] as? String
  let data4 = data["Date"] as? String
  let data5 = data["Time"] as? String

  self.list.append(listTxt(dog: data1!, person: data2!, action: data3!, time: data4!, date: data5!))
  }
}

self.tableView.reloadData()

【讨论】:

  • 效果很好!!!谢谢!!只有一个问题,它显示的数据是这样的:imgur.com/a/4guOcEB 它只检索 1 行,并且产生了很多重复。我该如何解决?你知道吗? :)
  • 我认为问题在于您如何填写tempTxt。例如,您有一个不必要的循环。
  • 您介意编辑文本并展示一个更好的示例吗? :) 哪个循环是不必要的? :)
  • 如果您总是使用documents.first,则无需遍历documents。删除循环或访问每个document。我更新了帖子
【解决方案2】:

self.tableView.reloadData() 更改为

self.list = tempTxt
DispatchQueue.main.async {
    self.tableView.reloadData()
}

并跳过从该函数返回的数组

【讨论】:

  • 你的意思是底部的“返回列表”?
  • 是的,然后更改 func 签名
  • 我现在在 tableview 中得到了结果,但只有一个问题,它显示的数据如下:imgur.com/a/4guOcEB 它只检索 1 行,并且产生了很多重复。我该如何解决?你知道吗? :)
  • 您应该遍历所有文档并获取数据,现在您只访问第一个文档 (first())
  • 将外循环更改为for document in QuerySnapshot!.documents,然后跳过内循环,只执行let data = document.data(),然后执行let data1 = data["Dog"]等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2017-06-29
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多