全局变量不会在匿名方法中存储任何数据

时间:2016-05-23 10:52:29

标签: ios json swift

试图获取nasa.gov小行星的数据。有一个asteroids的Asteroid实例数组的全局变量。 jsonData变量中大约有1000次出现。当我在第self.asteroids.append()行附加事件时,我可以看到它正在添加。当匿名completionHandler方法结束时,变量self.asteroids再次为空,因此不会重新加载任何数据。

它对我没有任何意义,因为asteroids是一个全局变量,它应该存储附加到它的任何数据。有人可以帮忙吗?

class ViewController: UITableViewController {

var asteroids = [Asteroid]()

override func viewDidLoad() {
    super.viewDidLoad()

    let connectionString: String = "https://data.nasa.gov/resource/y77d-th95.json"
    let url = NSURL(string: connectionString)!

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
        do {
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
            for index in 0 ... (jsonData.count - 1) {
                self.asteroids.append(Asteroid(name: jsonData[index]["name"] as! NSString as String))
            }
        } catch {
            print("Error")
            return
        }
    })

    task.resume()

    self.tableView.reloadData()
}

2 个答案:

答案 0 :(得分:1)

在修改了小行星数组后,将表视图的reloadData方法放在完成块中。 另一种方法是在asteroid didSet方法中重新加载数据:

var asteroids = [Asteroid]() {
  didSet {
    dispatch_async(dispatch_get_main_queue()) {
      self.tableView.reloadData()
    }
  }
}

在viewDidLoad函数范围结束后调用完成处理程序的代码。因为dataTaskWithURL是一个异步操作。

答案 1 :(得分:0)

是否为空或者您在 dataTask完成之前重新加载表格视图

尝试在完成闭包内移动reloadData:

override func viewDidLoad() {
    super.viewDidLoad()

    let connectionString: String = "https://data.nasa.gov/resource/y77d-th95.json"
    let url = NSURL(string: connectionString)!

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
        do {
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
            for index in 0 ... (jsonData.count - 1) {
                self.asteroids.append(Asteroid(name: jsonData[index]["name"] as! NSString as String))
            }
            self.tableView.reloadData()

        } catch {
            print("Error")
            return
        }
    })

    task.resume()

}

更新:第二种方法,如果你100%确定你希望更新tableView 下载所有数据后&解析可能是:

override func viewDidLoad() {
    super.viewDidLoad()

    let connectionString: String = "https://data.nasa.gov/resource/y77d-th95.json"
    let url = NSURL(string: connectionString)!

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
        do {
            let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
            for index in 0 ... (jsonData.count - 1) {
                self.asteroids.append(Asteroid(name: jsonData[index]["name"] as! NSString as String))
            }
            self.tableView.delegate = self
            self.tableView.dataSource = self

        } catch {
            print("Error")
            return
        }
    })

    task.resume()

}