如何在调用tableView之前更新变量

时间:2018-01-01 22:38:49

标签: ios swift

在下面的代码段中,SecondViewController通过FirstViewController中的segue打开(第一个视图控制器的内容未提供与问题无关)。 SecondViewController包含一个tableView,但显示时它是空的(serviceMain数组),我已经验证在tableView函数中调用数组,并且print(serviceMain.count)中的数组确实为空(B)阻止评论。但是,serviceMainViewDidLoadA块注释)中构造和调用时实际上不为空。

我尝试ViewDidLoad而不是ViewWillAppear,而是产生了相同的结果。

我确信必须与segues如何工作有关,因为我可以使用FirstViewController传递来自prepare(for segue:sender:)的{​​{1}}数据,而companyName这个数据是精细。我可以在serviceMain内更新FirstViewController并将数据传递给SecondViewController,但我希望我可能会遗漏某些内容,并且可以在SecondViewController内完成。非常感谢所有

import UIKit

class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var serviceMain: [Service] = []
    var companyName: String = "" // this value is updated with prepare from another ViewController via segue

    @IBOutlet var mobileTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        Service.parseData(providerName: companyName, id: 999) { (services: [Service]) in
            for service in services {
                self.serviceMain.append(service)
            }
            // (A) - serviceMain.count is returning a correct value:
            print("number of elements in serviceMain", serviceMain.count, "calling in viewDidLoad")
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // (B) - serviceMain.count is returning 0:
        print("number of elements in serviceMain", serviceMain.count, "calling in tableView:")
        return serviceMain.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = mobileTableView.dequeueReusableCell(withIdentifier: "mobileServiceCell", for: indexPath)
        let serviceIndividualRow = serviceMain[indexPath.row]
        cell.textLabel?.text = serviceIndividualRow.name!

        return cell
    }
}

1 个答案:

答案 0 :(得分:1)

尝试一下didSet。只要它在“set”之前调用,在viewDidLoad,viewWillLoad等之前调用。

var companyName: String? = "" {
    didSet {
        // DO SOMETHING
    }
}

编辑您关于体验延迟的评论:

当您获取数据时,您可能想尝试在其中添加获取数据代码:

DispatchQueue.global(qos: .userInteractive).async {
    // FETCH DATA FROM SERVER
}

此外,为了加快速度,无论您何时重新加载tableViews / collectionViews,您可能希望将其添加到其中:

DispatchQueue.main.async {
    self.tableView.reloadData()
}