📖

【学習備忘録】(Swift)URLSessionで取得したデータを画面に反映させる

2022/05/13に公開

はじめに

URLSessionについて学習し、取得したデータを画面に反映させました。

完成画面


GitHubAPIから自分の名前を取得し、画面に表示をさせています。

サンプルコード

1.Modelを定義

・jsonデータを確認し、idとnameを取得できるようにしています。
・jsonデータをデコードする(使えるように加工)ためDecodableに適合しています。

struct User: Decodable {
    let id: Int
    let name: String
}

2.データの取得

・今回、自分のGitHubアカウントのデータを取得するため、自分のユーザーネームのURLを指定しています。
・画面表示するにあたり、コールバックで実装しています。

class FetchUserData {
    // コールバックで実装しています。
    func getUserDataFromGithubAPI(completion: @escaping (User) -> Void) {
	// 自分のユーザーネームのURLを指定。
        let requestUrl = URL(string: "http://api.github.com/users/MasakatsuTagishi")!
	// URLSessionのdatataskを使い、dataとresponse(使っていません)とerrorを取得。
        let task = URLSession.shared.dataTask(with: requestUrl) { data, response, error in
	    // エラーが返ってきたときの処理。
            if let error = error {
                print("error", error)
	    // データ(json)が返ってきたときの処理。
            } else if let data = data {
                let decoder = JSONDecoder()
                do {
		    // データをデコード(jsonから画面に表示できるよう加工。)
		    // .decodeメソッドには、型名とデコードするData型を指定。
                    let decoded = try decoder.decode(User.self, from: data)
		    // コールバックする。
                    completion(decoded)
                } catch {
                    print("error")
                }
            }
        }
	// 実行
        task.resume()
    }

}

3.ViewControllerを実装

・上のデータ取得処理をインスタンス化。
・fetchUserData.getUserDataFromGithubAPI()でコールする。
・UIの描画や更新はメインスレッドで行う必要があるためDispatchQueue.main.asyncを使い、画面に表示。

class ViewController: UIViewController {

    @IBOutlet private weak var nameLabel: UILabel!
    
    let fetchUserData = FetchUserData()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    func setupUI() {
        fetchUserData.getUserDataFromGithubAPI { user in
            DispatchQueue.main.async {
                self.nameLabel.text = user.name
            }
        }
    }

}

これで、URLSessionを使い、取得したデータを画面表示することができました。
ちなみにuser.nameをuser.idにするとidも取得できます。

GitHub

https://github.com/MasakatsuTagishi/Practice-URLSession

参考にしたもの

1.[ライブ] URLSession, 非同期通信について解説します [Swift]

https://www.youtube.com/watch?v=dNKu-TtWXew&t=2881s

2.Swift実践入門

https://honto.jp/netstore/pd-book_30220833.html

3.たった2日でマスターできるiPhoneアプリ開発集中講座

https://books.rakuten.co.jp/rb/16508766/

さいごに

URLSessionについて学習しましたが、HTTP通信によるエラー処理や責務の切り分けなどを考えながら実装するとなると、まだまだ勉強しなければならないことを痛感しました...
間違いや認識違いがあれば指摘いただければ幸いです。

Discussion