在加载UI之前执行代码

时间:2015-06-16 22:59:00

标签: json swift

我刚刚开始学习Swift,我试图让Json数组显示在表视图中。

经过几个小时的调试后,我意识到当UI出现时,数据还没有准备好,因为我得到numberOfRowsInSection = 0

我想知道在从网址中提取Json数据后是否有办法加载表格。

提前感谢您的回答。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSURLConnectionDelegate  {
    @IBOutlet var tableView: UITableView!
    lazy var data = NSMutableData()
    var datatodisplay = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    startConnection()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    println(datatodisplay.count)
    return datatodisplay.count

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel?.text = datatodisplay[indexPath.row]
    return cell
}

  func startConnection(){
    //start connection to the the fixer.io API
    let urlPath: String = "http://api.fixer.io/latest"
    var url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.start()
}  

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func connectionDidFinishLoading(connection: NSURLConnection!) {
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
    var rawdata = jsonResult
    println(rawdata)
    dezarray(rawdata)
}

func dezarray(rawdata: NSDictionary){

    if let rawrates = rawdata["rates"] as? NSDictionary {
        println(rawrates)
        println((rawrates.count))
        println(rawrates["USD"])
        for (currency, rawrate) in rawrates {
            println("\(currency): \(rawrate)")
            datatodisplay.append("\(currency): \(rawrate)")
        }

        println(datatodisplay)
    }
}

}

1 个答案:

答案 0 :(得分:0)

当您从互联网上下载数据时,在首次显示用户界面时,您没有数据,这很常见。

这很容易解决。首先让表格视图显示为空。然后,只需在tableView.reloadData()方法结束时致电connectionDidFinishLoading即可。然后tableview将询问部分和行的数量,并使用刚刚完成加载的数据重新填充。

如果您想让用户知道他们需要等待数据下载,您可以在下载表格视图时显示UIProgressIndicator。如果用户可以单击在没有数据时崩溃的按钮,您可能还想要禁用UI。

有时,我会使用包含进度指示器的50%不透明黑色视图覆盖整个视图控制器的内容视图。该视图可防止用户同时点击任何内容并使视图变暗。然后当慢速任务完成时,我只是隐藏半透明的黑色视图。