试图获取 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/