まあ私はSwiftには新しく、補完ハンドラはあまり知られていません。 APIからリクエストを受け取り、トークンを取得できるようにJSONレスポンスを解析する必要があります。しかし私のコードでは、getAuthentication
関数を呼び出すたびにUIがフリーズし、データが取得されるのを待っているということがあります。次は、getAuthentication
非同期APIリクエストへの同期APIリクエストSwift 2.2
func getAuthentication(username: String, password: String){
let semaphore = dispatch_semaphore_create(0);
let baseURL = "Some URL here"
let url = NSURL(string: baseURL)!
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = "{\n \"username\": \"\(username)\",\n \"password\": \"\(password)\"\n}".dataUsingEncoding(NSUTF8StringEncoding);
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if error == nil{
let swiftyJSON = JSON(data: data!)
print(swiftyJSON)
//parse the data to get the user
self.id = swiftyJSON["id"].intValue
self.token = swiftyJSON["meta"]["token"].stringValue
} else {
print("There was an error")
}
dispatch_semaphore_signal(semaphore);
}
task.resume()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
のコードです。次に、このメソッドをLoginViewControllerで呼び出しています。私はUIがフリーズする理由を同期リクエストを使っていると言いますが、Asyncに変更してデータがダウンロードされるまで待つ方法はまったく分かりません。誰かがこれで私を助けることができますか?どんな助けも高く評価されます。
アウト[Alamofire(https://github.com/Alamofire/Alamofire)。非同期HTTPリクエストを実行するための便利なフレームワークです。 –
セマフォを削除するだけです。あなたはそれでメインスレッドをブロックしています。完了クロージャで応答を処理する必要があります – Paulw11
@Reginald、ここで使用される 'NSURLSession'の' dataTaskWithRequest'関数は非同期関数です。ここで 'dispatch_queue'を使う必要はありません。私の答えをチェックすることができます。疑問のある方はお気軽に – KrishnaCA