2016-12-31 3 views
3

Я пытаюсь обновить некоторые метки на основе данных, возвращенных из JSON. Вот данные объекты и функции для обновления объектов JSON данных:Как обновить интерфейс с помощью результата JSON через обработчик завершения?

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

Вот где я пытаюсь обновить пользовательский интерфейс:

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() в конец блока завершения, но метки все еще остаются пустыми. EDIT: Я заметил, что если поставить точку останова внутри блока завершения в viewDidLoad, это не вызвано.

+0

сделал попытку обновления метки на главную очереди? Использование: 'DispatchQueue.main.async (execute: {})' –

+0

Я просто попробовал, он не работал – SwiftyJD

ответ

2

Вы никогда не называете свой обработчик завершения в пределах downloadAllData, поэтому его закрытие никогда не будет выполнено для установки ваших меток.

На месте этой линии, где вы создать sampleJSON и ничего не делать с ним:

sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal) 

возвращение sampleJSON в пределах completionHandler:

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

Это имеет смысл, но теперь метки возвращают nil – SwiftyJD

+0

@SwiftyJD Это потому, что ваш блок завершения должен использовать возвращаемый ' sampleJSON 'как обработчик завершения downloadAllData' указывает, но вы игнорируете эти значения, заменив их на _. Вместо использования этих возвращаемых значений вы используете 'self.JSON? .airbnbUS' и' self.JSON? .airbnbLocal', когда кажется, что 'self.JSON' не был установлен в какой-либо точке вашего кода и, следовательно, равно нулю. Если 'self.JSON == nil',' self.JSON? .airbnbUS' и 'self.JSON? .airbnbLocal' также будут равны нулю. Короче говоря, используйте 'sampleJSON', возвращенный из' downloadAllData', чтобы заполнить ваши метки. –

+1

Хорошо, я понимаю, что вы имеете в виду. Он работает сейчас, спасибо за вашу помощь! – SwiftyJD

Смежные вопросы