在 URLSession.shared.dataTask 和 ViewController 之间共享数据
Sharing data between URLSession.shared.dataTask and ViewController
我在 URLSession.shared.dataTask
和 ViewController
class 之间共享数据时遇到问题。我正在使用 DispatchQueue
并且在直接存储到 label 时似乎工作正常,但是,当我尝试将信息存储到 本地字段 这种方法行不通。
这是我当前的代码:
class ViewController: UITableViewController {
var plantManager: PlantManager!
override func viewDidLoad() {
super.viewDidLoad()
getPlantData()
print("Info To Print:" + plantManager.getExtTemp())
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func getPlantData(){
let session = URLSession.shared
let urlPath = PlantURL().getFullURL()
let url = NSURL(string: urlPath)!
print(url)
let request = NSURLRequest(url: url as URL)
let dataTask = session.dataTask(with: request as URLRequest) { (data:Data?, response:URLResponse?, error:Error?) -> Void in do{
if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [[String:Any]],
let dict = jsonResult.first {
DispatchQueue.main.sync(execute: {
self.plantManager = PlantManager(intTemp: (dict["ExternalTemperature"] as? String)!, moist: (dict["SoilMoisture"] as? String)!, humidity: (dict["AmbientHumidity"] as? String)!, extTemp: (dict["ExternalTemperature"] as? String)!)
})
}else{
print("No Parsing Correctly")
}
}catch let error as NSError{
print(error.localizedDescription)
}
print("done, error: \(error)")
}
dataTask.resume()
}
}
plantManager
字段是 nil
,显然,我无法访问 getter plantManager.getExtTemp()
。我是 Swift 的新手,我不明白为什么这种方法可以写入标签,但在使用字段时却不行。
非常感谢您的帮助。先感谢您。
dataTask
异步工作,使用完成处理程序:
声明方法
func getPlantData(completion: ()->()) {
并替换
DispatchQueue.main.sync(execute: {
self.plantManager = PlantManager(intTemp: (dict["ExternalTemperature"] as? String)!, moist: (dict["SoilMoisture"] as? String)!, humidity: (dict["AmbientHumidity"] as? String)!, extTemp: (dict["ExternalTemperature"] as? String)!)
})
和
DispatchQueue.main.async {
self.plantManager = PlantManager(intTemp: dict["ExternalTemperature"] as! String, moist: dict["SoilMoisture"] as! String, humidity: dict["AmbientHumidity"] as! String, extTemp: dict["ExternalTemperature"] as! String)
completion()
}
并在 viewDidLoad
中调用它
getPlantData() {
print("Info To Print:" + plantManager.getExtTemp())
}
我在 URLSession.shared.dataTask
和 ViewController
class 之间共享数据时遇到问题。我正在使用 DispatchQueue
并且在直接存储到 label 时似乎工作正常,但是,当我尝试将信息存储到 本地字段 这种方法行不通。
这是我当前的代码:
class ViewController: UITableViewController {
var plantManager: PlantManager!
override func viewDidLoad() {
super.viewDidLoad()
getPlantData()
print("Info To Print:" + plantManager.getExtTemp())
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func getPlantData(){
let session = URLSession.shared
let urlPath = PlantURL().getFullURL()
let url = NSURL(string: urlPath)!
print(url)
let request = NSURLRequest(url: url as URL)
let dataTask = session.dataTask(with: request as URLRequest) { (data:Data?, response:URLResponse?, error:Error?) -> Void in do{
if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [[String:Any]],
let dict = jsonResult.first {
DispatchQueue.main.sync(execute: {
self.plantManager = PlantManager(intTemp: (dict["ExternalTemperature"] as? String)!, moist: (dict["SoilMoisture"] as? String)!, humidity: (dict["AmbientHumidity"] as? String)!, extTemp: (dict["ExternalTemperature"] as? String)!)
})
}else{
print("No Parsing Correctly")
}
}catch let error as NSError{
print(error.localizedDescription)
}
print("done, error: \(error)")
}
dataTask.resume()
}
}
plantManager
字段是 nil
,显然,我无法访问 getter plantManager.getExtTemp()
。我是 Swift 的新手,我不明白为什么这种方法可以写入标签,但在使用字段时却不行。
非常感谢您的帮助。先感谢您。
dataTask
异步工作,使用完成处理程序:
声明方法
func getPlantData(completion: ()->()) {
并替换
DispatchQueue.main.sync(execute: {
self.plantManager = PlantManager(intTemp: (dict["ExternalTemperature"] as? String)!, moist: (dict["SoilMoisture"] as? String)!, humidity: (dict["AmbientHumidity"] as? String)!, extTemp: (dict["ExternalTemperature"] as? String)!)
})
和
DispatchQueue.main.async {
self.plantManager = PlantManager(intTemp: dict["ExternalTemperature"] as! String, moist: dict["SoilMoisture"] as! String, humidity: dict["AmbientHumidity"] as! String, extTemp: dict["ExternalTemperature"] as! String)
completion()
}
并在 viewDidLoad
getPlantData() {
print("Info To Print:" + plantManager.getExtTemp())
}