2016-12-31 33 views
3

我想根據從JSON返回的數據更新一些標籤。下面是數據對象和更新JSON數據對象的功能:如何通過完成處理程序使用JSON結果更新UI?

class sampleJSON { 


    var airbnbUS: Int? 
    var airbnbLocal: Int? 


    init(airbnbUS: Int, airbnbLocal: Int?) { 
    self.airbnbUS = airbnbUS 
    self.airbnbLocal = airbnbLocal 
    } 

    //Used to download data to local objects using the network service manager 
    static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) ->()) { 

    let usm = UrlSessionNetworkManager.sharedManager 

    if let jsonDictionary = usm.parseJSONFromData(urlExtension:"\(urlExtension)") 

    { 
     if let resultsDictionary = jsonDictionary["result"] as? [[String : Any]]?{ 
     let costDictionary = resultsDictionary?[0] 
     let cost = costDictionary?["cost"] as? [String: Any] 

     if let airbnb = cost?["airbnb_median"] as? [String: AnyObject]{ 
      let airbnbUS = airbnb["USD"] as! Int 
      let airbnbLocal = airbnb["CHF"] as! Int 

     sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal) 
     } 
     } 
    } else { 
     print("Error: Cannot retrieve JSON Data") 
    } 
    } 
} 

這裏就是我試圖更新UI:

var JSON: sampleJSON? 

override func viewDidLoad() { 
    super.viewDidLoad() 

     sampleJSON.downloadAllData(urlExtension:"cities/basel-switzerland",completionHandler: {_ in 

    DispatchQueue.main.async(execute: { 
    self.topLabel.text = String(describing: self.JSON?.airbnbUS) 
    self.lowerLabel.text = String(describing: self.JSON?.airbnbLocal) 
    }) 
}) 

截至目前,當viewDidLoad中被稱爲標籤是空白的,我試圖在完成塊的末尾添加一個self.view.setNeedsDisplay(),但標籤仍然保持空白。 編輯:我注意到如果我在viewDidLoad中的完成塊內部放置一個斷點,它不會被調用。

+0

沒有嘗試在主隊列更新標籤?使用:'DispatchQueue.main.async(execute:{})' –

+0

我剛試過,它沒有工作 – SwiftyJD

回答

2

您永遠不會在downloadAllData內呼叫您的完成處理程序,因此它的關閉永遠不會執行來設置您的標籤。

代替這一行的,你創建一個sampleJSON,什麼也不做它:

sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal) 

回報sampleJSONcompletionHandler

completionHandler(sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal)) 
+0

這很有道理,但現在標籤返回零 – SwiftyJD

+0

@SwiftyJD這是因爲你的完成塊應該使用返回的' sampleJSON'作爲'downloadAllData'的完成處理程序指示,但是您將忽略這些值並將其替換爲_。當您的代碼中的任何一點都沒有設置self.JSON時,您可以使用'self.JSON?.airbnbus'和'self.JSON?.airbnbLocal'來代替這些返回值,因此等於零。如果'self.JSON == nil','self.JSON?.airbnbUS'和'self.JSON?.airbnbLocal'也等於零。因此,簡而言之,使用'downloadAllData'返回的'sampleJSON'來填充標籤。 –

+1

好的,我明白你的意思了。它現在有效,謝謝你的幫助! – SwiftyJD