2017-07-13 13 views
1

こんにちは、alamofireを使用してjsonの気象データをダウンロードしようとしています。 ここに私のコード、作業バージョンです:Alamofireがクラスプロパティデータを更新できませんでした

class WeatherModel { 
    private var _date: String? 
    private var _location: String? 
    private var _weatherType: String? 
    private var _temperature: Double? 

    func getWeatherInfoFromAPI(completed: @escaping()->()) { 
    let url = URL(string: WEATHER_URL)! 
    Alamofire.request(url).responseJSON(completionHandler: { response in 
    // Test updating data 
    self._temperature = 25 
    self._weatherType = "Clear" 
    self._location = "Vietnam" 
    completed() 
    }) 

    } 
} 

- >この方法では、私はクラスのプロパティを更新することができています。 getWeatherInfoFromAPIのFUNCのクラスプロパティのバージョン更新に失敗

:だから

 func getWeatherInfoFromAPI(completed: @escaping()->()) { 
     let url = URL(string: WEATHER_URL)! 
     Alamofire.request(url).responseJSON{ response in 
     // Test updating data 
     self._temperature = 25 
     self._weatherType = "Clear" 
     self._location = "Vietnam" 
    } 
    completed() 
    } 

は、私はそれらの違いが何であるかを知りません。 2つの方法の間で明確にするために私を助けてください。

Alamofire.request(url).responseJSON(completionHandler: { response in }) 

Alamofire.request(url).responseJSON{ response in } 

私のコードは動作しないという理由は何ですか?私はAlamofireのドキュメントも2番目の方法のように使います!私はそれらの間のスレッドの違いについて考えています

また、どのようにコードがresponseJSONで実行されているスレッドを知っていますか?

ありがとう、私はあなたの時間と助けてくれてありがとう!

答えて

1

これらの2つの方法は機能的には同じですが、2つ目はSwiftの後続のクロージャ構文を使用しています。

completed()で何をしますか?最初の例では、ネットワークコールの完了時にコールしています.2番目のケースでは、のネットワークコールを開始した直後にコールしています。コールはまだ完了していません。最初の例のように、Alamofireコールバックのifを呼び出す必要があります。 2番目の例では、completed内のプロパティを調べている場合、まだ更新されていないのは不思議ではありません。

+0

これは、アラモファイア要求がバックグラウンドで開始された後、すぐにメインスレッドに戻って2番目の方法で完了することを意味します。したがって、データはまだ受信されました –

+0

貼り付けた2つの例は、使用したAlamofireコールバック構文だけでなく、 'completed()'呼び出しを置いた場所も異なります。最初の例では、alamofireコールバックに 'completed()'コールを入れました。それが、あなたが使用したクロージャの構文にとっての理由です。 –

+0

本当に助けていただければ幸いです。 –

関連する問題