📖
【学習備忘録】(Swift)URLSessionで取得したデータを画面に反映させる
はじめに
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
参考にしたもの
1.[ライブ] URLSession, 非同期通信について解説します [Swift]
2.Swift実践入門
3.たった2日でマスターできるiPhoneアプリ開発集中講座
さいごに
URLSessionについて学習しましたが、HTTP通信によるエラー処理や責務の切り分けなどを考えながら実装するとなると、まだまだ勉強しなければならないことを痛感しました...
間違いや認識違いがあれば指摘いただければ幸いです。
Discussion