2016-12-31 8 views
3

JSONから返されたデータに基づいていくつかのラベルを更新しようとしています。今のviewDidLoadが呼ばれたときのようJSON結果を使用して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) 
    }) 
}) 

:私は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") 
    } 
    } 
} 

されています。ここでは、データオブジェクトとJSONデータオブジェクトを更新する機能がありますラベルは空白ですが、完成ブロックの最後にself.view.setNeedsDisplay()を追加しようとしましたが、ラベルはまだ空白のままです。 編集:それは呼び出されていないviewDidLoadで完了ブロック内にブレークポイントを置く場合気づいた。

+0

あなたがメインキューにラベルを更新してみたのですか? –

+0

私はちょうど試してみましたが、うまくいきませんでした – SwiftyJD

答えて

2

完了ハンドラをdownloadAllDataの中で決して呼び出さないようにして、ラベルを設定することは決してありません。あなたがsampleJSONを作成し、それを何もしないで、このラインの代わりに

sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal) 

リターンsampleJSONcompletionHandler内:

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

これは意味がありますが、ラベルはnilを返すようになりました – SwiftyJD

+0

@SwiftyJDこれは、補完ブロックが返された ' sampleJSON'は 'downloadAllData'の補完ハンドラとして示していますが、それらの値は_で置き換えて無視しています。 'self.JSON?.airbnbUS'と' self.JSON?.airbnbLocal'を使用している戻り値を使用するのではなく、 'self.JSON'があなたのコードのどこかで設定されているように見えます。 nilと等しくなります。 'self.JSON == nil'の場合、' self.JSON?.airbnbUS'と 'self.JSON?.airbnbLocal'もゼロになります。簡単に言えば、 'downloadAllData'から返された' sampleJSON'を使ってラベルを設定します。 –

+1

あなたが何を意味するかわかりました。それは今、あなたの助けに感謝します! – SwiftyJD

関連する問題