だから、私は、次の簡単なデータモデルタイプ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)")
}
予想される出力:
論理的には、
私はプライベートVARSの異なる計算値をロードする必要があり
downloadWeatherDetails
関数と呼ばCurrentWeather
オブジェクトを作成しました。
コールユーザーは、だから、出力が
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
したがって、基本的に関数downloadWeatherDetails
とupdateMainUI
が間違った順序で呼び出されていますか?なぜこれはそうですか?これは何らかの形で非同期関数の実行に関係していますか?
私は後閉じを使用しようとしましたが、それでも動作しません。
私はまた、空の閉鎖を残し、この
currentWeather.downloadWeatherDetails {
}
self.updateMainUI()
ようupdateMainUI
downloadWeatherDetails
後にコールを呼び出してみました。しかし、これはあまりにも動作しません。関数が間違った順序で呼び出された理由のアイデア?
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
残りのコードを 'downloadWeatherDetails'メソッドで表示する必要があります。あなたはたぶん間違った場所で補完ハンドラを呼び出すでしょう。 – dan
私はちょうどプロジェクトにGitHubリンクを添付しました。その正確なファイルはここにありますhttps://github.com/danny311296/Weather-App/blob/master/Weather%20Forcast/CurrentWeather.swift –
アラモファイア補完ハンドラ内で完了ハンドラを呼び出す必要があります – dan