-1

私はC#の背景から来て、私のSwiftアプリで待っている機能を実装したいと思っています。私は望みの結果を達成しましたが、私はよく分からないセマフォを使用しなければなりませんでした。私は成功値を持つJSONを返すalamoリクエストを持つ関数を持っており、リクエスト関数が完了ハンドラと非同期であることを理解しています。要求が完了すると、ハンドラが起動します。問題はその操作からの成功値を返すことです。Swiftのタスクの結果を「待つ」

func AlamoTest() -> Bool{ 
var success = false 
//Do some things... 
//... 
//Signal from async code 
let semaphore = DispatchSemaphore(value: 0) 
Alamofire.request("blah blah blah", method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in { 
    success = response["success"] 
    if(success){ 
     //Do some more things 
    } 
    semaphore.signal() //Signal async code is done 
} 
//Wait until async code done to get result 
semaphore.wait(timeout: DispatchTime.distantFuture) 
return success 
} 

私の目標を達成するための「より良い」方法はあります:ここで私がやっているの擬似コードの例ですか?私はSwiftとその非同期構文が初めてです。

+0

Aさんですか?真剣に? – Seapoe

答えて

0

私が見つけたベストソリューションは、私が「コールバックチェーン」と呼んでいるものです。私のメソッドの例は次のようになります。

最後のパラメータは、元の非同期操作が完了した後に実行されるクロージャです。あなたはクロージャーに結果を渡し、それを使ってあなたが望むことをします。私の場合は、非同期操作が行われている間にビューを無効にしたかったのです。アラモ非同期操作の結果がメインスレッドで呼び出されるため、クロージャ引数でビューを有効にすることができます。結果を必要とせず連鎖を停止する場合、completionHandlerのデフォルトはnilです。

+0

https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f –

関連する問題