2017-06-15 22 views
4

だから、私は、次の簡単なデータモデルタイプDownloadCompleteがメインViewController.swiftで()->()Swift:関数が間違った順序で呼び出されましたか?

にタイプの別名で、私が作成した

class CurrentWeather 
{ 
    private var _cityName: String! 
    private var _date: String! 
    private var _weatherType: String! 
    private var _currentTemp: Double! 

    var cityName: String 
    { 
     if _cityName == nil 
     { 
      _cityName = "" 
     } 
     return _cityName 
    } 

    // Same idea for getters var date, var weatherType and 
    // var currentTemp (returns 0.0 if it is nil) 
    // Not showing that here 

    func downloadWeatherDetails(completed: DownloadComplete) 
    { 
    // Function which computes values though a url and stores in instance variables 
    // Not showing the entire actual function here 
       self._cityName = name.capitalized. // value computed earlier 
       print(self._cityName) 
       self._weatherType = main.capitalized // value computed earlier 
       print(self._weatherType) 


       self._currentTemp = currentTemp - 273.15 // value computed earlier 
       print(self._currentTemp) 

       completed() 

    } 

} 

と天気アプリケーションに取り組んできました(末尾のクロージャ構文で)この機能と呼ばれるオブジェクトとそう

var currentWeather: CurrentWeather! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    currentWeather = CurrentWeather() 
    currentWeather.downloadWeatherDetails { 
     self.updateMainUI() // I have created this function 
    } 
} 
func updateMainUI() 
{ 
    dateLabel.text = currentWeather.date 
    currentTempLabel.text = String(currentWeather.currentTemp) 
    locationLabel.text = currentWeather.cityName 
    currentWeatherTypeLabel.text = currentWeather.weatherType 
    currentWeatherImage.image = UIImage(named: currentWeather.weatherType) 

    print("Tested: \(currentWeather.currentTemp)") 
    print("Tested: \(currentWeather.cityName)") 
    print("Tested: \(currentWeather.weatherType)") 
} 

予想される出力:

論理的には、

  1. 私はプライベートVARSの異なる計算値をロードする必要がありdownloadWeatherDetails関数と呼ばCurrentWeatherオブジェクト

  2. を作成しました。

  3. コールユーザーは、だから、出力が

    Birim. //cityname 
    
    Clear. //weatherType 
    
    29.134 //currentTemp 
    
    Tested: 29.134 
    
    Tested: Birim 
    
    Tested: Clear 
    

    しかし、私が手出力が

    であるようにする必要があります私のアプリのUI

に異なる値を表示するupdateMainUI機能を定義しました

Tested: 0.0 

Tested:    (indicating "") 

Tested:    (indicating "") 

Birim 

Clear 

29.134 

したがって、基本的に関数downloadWeatherDetailsupdateMainUIが間違った順序で呼び出されていますか?なぜこれはそうですか?これは何らかの形で非同期関数の実行に関係していますか?

私は後閉じを使用しようとしましたが、それでも動作しません。

私はまた、空の閉鎖を残し、この

currentWeather.downloadWeatherDetails { 

} 
self.updateMainUI() 

ようupdateMainUIdownloadWeatherDetails後にコールを呼び出してみました。しかし、これはあまりにも動作しません。関数が間違った順序で呼び出された理由のアイデア?

UPDATE:

プロジェクトファイルに(ここでは、次のとおりです。非下線の変数は

var cityName: String 
    { 
     if _cityName == nil 
     { 
      _cityName = "" 
     } 
     return _cityName 
    } 

    // Same idea for getters var date, var weatherType and 
    // var currentTemp (returns 0.0 if it is nil) 
    // Not showing that here 

UPDATE 2のようなゲッターをしている間

アンダースコア変数がプライベートVARSあります場合は、参照することがあります):https://github.com/danny311296/Weather-App

+0

残りのコードを 'downloadWeatherDetails'メソッドで表示する必要があります。あなたはたぶん間違った場所で補完ハンドラを呼び出すでしょう。 – dan

+0

私はちょうどプロジェクトにGitHubリンクを添付しました。その正確なファイルはここにありますhttps://github.com/danny311296/Weather-App/blob/master/Weather%20Forcast/CurrentWeather.swift –

+0

アラモファイア補完ハンドラ内で完了ハンドラを呼び出す必要があります – dan

答えて

2

あなたはAlamofire要求コールバックの中にあなたの「完成()」関数を呼び出す必要があります。要求関数は非同期であるため、completed()を実行する前に終了するのを待機しません。

Alamofire.request(CURRENT_WEATHER_URL).responseJSON { response in 

    // handle response... 

    // when done call completed 
    completed() 
} 
+0

holaの説明をありがとう。それは今働いている。 –

0

ダウンロードプロセスの完了前に、あなたの "updateMainUI"メソッドが呼び出されていることが問題だと思います。完了リスナーを実装していますが、これは機能しているはずですが、私はそれに間違いはありません。ダウンロードプロセスを観察するために、委任や通知などの他の方法を使用してください。完了を観察するために他の方法を参照するには

チェックこのリンク:

https://medium.com/ios-os-x-development/ios-three-ways-to-pass-data-from-model-to-controller-b47cc72a4336

+0

更新された返信に感謝します。私はそれを調べます。 –

+0

あなたは大歓迎です! –

関連する問題