0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

API通信とAPI通信による非同期処理時のクロージャの利用してそれらの挙動を確認する

Last updated at Posted at 2023-01-13

はじめに

①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
//}

おわりに

不備がありましたらぜひコメント欄にてご指摘ください。

参考記事

開発環境

  • Xcode-13.4.1
  • Swift version 5.7
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?