2017-05-18 2 views
0

URLSession.shared.dataTaskViewControllerクラスの間でデータを共有する際に問題が発生しています。私はDispatchQueueを使用しており、ラベルに直接保存するとうまくいくようですが、ローカルフィールドに情報を保存しようとすると、この方法は機能しません。URLSession.shared.dataTaskとViewControllerの間でデータを共有する

これは私の現在のコードです:

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と明らかにされ、私はゲッターplantManager.getExtTemp()でアクセスすることはできません。私は新しいSwiftを使っています。なぜこのアプローチがラベルに書き込むのがうまくいくのか理解できませんが、フィールドを使用するときは理解できません。

本当にありがとうございます。前もって感謝します。

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() 
} 

と宣言方法を

答えて

1

dataTaskは、完了ハンドラを使用して非同期に動作しますお電話くださいviewDidLoad

getPlantData() { 
    print("Info To Print:" + plantManager.getExtTemp()) 
} 
+0

ご連絡いただきありがとうございます。 – LDG

関連する問題