はじめに
①URLSessionのdataTask(with: complitionHandler)を使ったAPI通信と②API通信による非同期処理時のクロージャの利用してそれらの挙動を確認する。また、使用するAPIは郵便番号検索APIである。7桁の郵便番号を入力すると住所の情報が返ってくる。
詳細
- API通信とAPI通信による非同期処理時のクロージャの利用に関してそれらの挙動を確認する
- 要は、API通信をしてそれをクロージャで受け取った非同期処理をする
- 今回、API通信を行うにあたってURLSessionのdataTask(with: complitionHandler)を使う
Swift
//print関数で[番号]を出力している箇所があるが、
//非同期処理で行なっているので必ずしも順番で処理が走るわけではないことに注意
// URLSession.shared.dataTaskを使ってサーバーと通信するメソッド
// closure: @escaping( (String) -> Void ) は非同期処理時に利用するクロージャーのこと
func api(zipCode: String, closure: @escaping( (String) -> Void ) ) {
print("[1] api関数の処理を開始")
//住所検索のAPI
let url = URL(string: "https://zipcloud.ibsnet.co.jp/api/search?zipcode=\(zipCode)")!
let request = URLRequest(url: url)
// URLSession.shared.dataTaskメソッドがcompletionHandlerという名前のクロージャをパラメータに持っている
// 次に定義するのは、それに渡すclosure
// api通信が終わればこのclosureに代入され、実行される
let dataTaskCompletionClosure = { (data: Data?, response: URLResponse?, error: Error?) in
print("[2] dataTaskCompletionClosureに代入し、処理を開始")
guard let data = data else {
closure("通信失敗")
return
}
let jsonStr = String(data: data, encoding: .utf8)!
print("[3] api関数実行時に渡しているclosure定数に代入され、実行する")
closure(jsonStr)
}
print("[4] api通信するためのメソッドdataTaskにdataTaskCompletionClosureを代入")
let task = URLSession.shared.dataTask(with: request, completionHandler: dataTaskCompletionClosure)
print("[5] resumeメソッドを実行すると通信が始まる")
task.resume()
print("[6] 通信が終わるのを待たずにメソッドを抜ける")
}
// api関数の実行時に渡す定数
let zipcode = "1006117"
//このclosureはapi関数のレスポンスを受け取る
//関数の中でAPI通信でdataを取得している
let inputClosure = { response in
print("[7] inputClosure定数に代入され、処理を開始")
print(response)
}
print("[8] api関数の実行前に行う処理")
api(zipCode: zipcode, closure: inputClosure)
print("[9] api関数の実行後に行う処理")
//出力
//{
// "message": null,
// "results": [
// {
// "address1": "東京都",
// "address2": "千代田区",
// "address3": "永田町山王パークタワー 17階",
// "kana1": "トウキョウト",
// "kana2": "チヨダク",
// "kana3": "ナガタチョウサンノウパークタワー17カイ",
// "prefcode": "13",
// "zipcode": "1006117"
// }
// ],
// "status": 200
//}
おわりに
不備がありましたらぜひコメント欄にてご指摘ください。
参考記事
-
iOSエンジニアを目指すプログラミング初心者のほとんどが躓くクロージャを徹底的に細かく分解して解説していく (練習問題あり、回答のみ有料)
-
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- Swift version 5.7