スウィフトクロージャを使用することができます。彼らはそれのために作られています。
アップルガイドを参照してください:Closures
ここでは、あなたの特定のケースで必要なコードです。
完了済みはクローズです。 getTheSearchLocationAndRange()
が呼び出されると、そのコードは関数のすべての処理が完了するのを待つcompleted()
行まで実行されます。プロセスが終了すると(例えば、ダウンロード)、completed()
は、getTheSearchLocationAndRange {() ->() in
で定義されたコードをアクティブにするクロージャを呼び出します。したがって、loadDataFromDatabase()
は、getTheSearchLocationAndRange()
が完全に実行を終了し、データが存在する場合(nilでない場合)にのみ呼び出されます。私は、これはあなたの問題を解決し、ところで、あなたの質問:)
に答えを期待
var searchLocation = String()
var searchLocationCoordinates = [String:Double]()
var searchRange = Int()
typealias FinishedDownload =() ->()
override func viewDidLoad() {
super.viewDidLoad()
getTheSearchLocationAndRange()
}
func getTheSearchLocationAndRange(completed: FinishedDownload) {
// Code for searching Location Range HERE
completed()
}
getTheSearchLocationAndRange {() ->() in
loadDataFromDatabase()
}
は、一部を「ぶら下げあなたのGUIを残す」について、Alamofireは自動的にあなたのためにこれを引き受け。 Alamofireを使用しない場合は、非同期要求をバックグラウンドスレッドに手動で割り当てて、GUIが応答しなくなるようにする必要があります。
あなたがそう言っていないが、getThSearchLocationAndRangeが非同期でなければなりませんか?あなたが待ってはいけない場合は、GUIをハングアップさせるでしょう。代わりに、最初の関数をパラメータとして完成ブロックにし、ブロック本体として2番目の関数を置くこともできます。それ以外の方法もあります。 – Gruntcakes
ええ、それがありました!私にそれを示すサンプルコードがありますか?しかし、それは完了ハンドラで他の投稿に見たアイデアでもありました! – Mattk90
getTheSearchLocationAndRangeにディスパッチ機能がありますか? – FredericP