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

标签 ios json swift

试图获取 nasa.gov 小行星的数据。有一个小行星实例数组的asteroids全局变量。 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()
}

最佳答案

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

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

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

关于ios - 全局变量在匿名方法中不存储任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37389041/

相关文章:

json - 为嵌入式结构使用自定义 JSON Marshal() 的问题

java - HTTP/1.1 415 处理 JSON 时不支持的媒体类型

python - JSON 中双引号前添加反斜杠

ios - Swift 不能使用 ObjectiveC 类

ios - 为什么这段代码会按这个顺序执行?寻找流程的解释

带有 Swift 的 iOS : App crashes on UITableView scroll down event

ios - 在关闭动画之前运行 UIAlertController 完成处理程序 block

ios - 使用 Swift 以编程方式更改 View - 不起作用

ios - NSLayoutConstraint outlets 始终为 nil 而其他 outlets 则不是

ios - 带有 LiveFrost LFGlassView 的 UIView 动画