使用Firebase填充阵列填充原型单元格

问题描述:

如何使用Firebase填充TableView单元格?我试图用Firebase填充数组来填充它,但由于数据是异步填充的,我不知道如何使数组填充getData()函数之外的数据。截至目前,数据在完成处理程序中被填充,但在其之外,它是零。使用Firebase填充阵列填充原型单元格

import UIKit 
import Firebase 

class ProxiesListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var ProxiesTableView: UITableView! 

var proxyname:[String] = [] 
var proxyprice:[Int] = [] 
var proxycountry:[String] = [] 

var databaseRef : FIRDatabaseReference! 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return proxyname.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ProxiesTableViewCell 
    cell.countryFlag.image = UIImage(named: proxycountry[indexPath.row]) 
    cell.NameLabel.text = proxyname[indexPath.row] 
    cell.priceLabel.text = "$" + String(proxyprice[indexPath.row]) 
    return(cell) 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    //add code 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    ProxiesTableView.delegate = self 
    ProxiesTableView.dataSource = self 

    getData() 
} 

func getData() { 
    databaseRef = FIRDatabase.database().reference() 

    /* 
    proxyname = ["50 Proxies (24 Hours)", "100 Proxies", "10 Proxies", "60 Proxies (48 Hours)"] 
    proxyprice = [600, 140, 60, 10] 
    proxycountry = ["CA", "UK", "UK", "US"] 
    */ 

    self.databaseRef.child("ProxiesItemsFeed").observe(.childAdded, with: { (snapshot) in 

     if let proxynames = snapshot.key as String! { 
      self.proxyname.append(proxynames) 
       self.databaseRef.child("ProxiesItemsFeed").child(proxynames).observe(.childAdded, with: { (snapshot) in 

        if let country = snapshot.key as String! { 
         self.proxycountry.append(country) 
        } 

        if let price = snapshot.value as! Int! { 
         self.proxyprice.append(price) 
        } 
       }) 
      } 
     }) 
    } 
} 
+0

如果将* print(snapshot)*添加为闭包内的第一行,会发生什么情况。它打印什么?第二个问题:使用.childAdded迭代多少个节点?最后一件事是你在闭包中丢失了一个tableView.reloadData(),但是,如果你有1000个子节点会重载你的tableView 1000次并且效率不高。有几个选项可以帮助解决这个问题,但在提出解决方案之前,我们首先需要更多信息。 – Jay

+0

我现在已经开始工作了,但每次我重新加载页面时,都会出现索引超出范围的错误。 – user7780338

+0

你的意思是重新加载* tableView *?发生错误的线是什么? – Jay

您应该添加tableView.reloadData()完成处理内(即,一个在你的getData()法)。

方法文档:

调用此方法重新加载用于构造该表中,包括细胞,部分页眉和页脚,索引阵列,等等的所有数据。

+0

它仍然没有显示任何东西 – user7780338

+0

@ user7780338你的'if let price = ...'看起来很奇怪。这不应该是'如果让价格= snapshot.value为? Int'?你确定你没有得到任何运行时错误吗? –

+0

我没有得到任何运行时错误,一切正常,除了单元格不能填充,因为该数组在零数据的getData()函数的末尾。 – user7780338