URLSession을 이용해서 먼저 기초적인 접근을 구현했다.
우선 view에 label과 button을 배치하고, 버튼을 눌렀을때
특정 사이트에 api를 요청해 데이터를 받아 출력하려고 했다.
api는 https://api.kanye.rest/ 라는 사이트에서 무작위로
quote를 생성해주기 때문에 여기에 요청을 하여 데이터를 받았다.
코드
//
// ViewController.swift
// UsingURLSession
//
// Created by 이재영 on 2023/01/27.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func randomQuote(_ sender: Any) {
let url = URL(string: "https://api.kanye.rest/")!
let task = URLSession.shared.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
if let error = error {
print("Error", error)
return
}
let json = try! JSONSerialization.jsonObject(with: data!, options: []) as! [String: String]
print(json)
}
task.resume()
}
}
정상적으로 데이터를 받아 출력해주지만, 이제 Label에
quote를 띄울려고 하여 코드 변경을 해주었다. 단순히
print문을 label.text로 하여 띄울려고 하면 아무것도 나오지 않는다.
그 이유는 요청하여 데이터를 받는 작업은 시간이 꽤 많이 소모되기 때문에
background 에서 수행되기 때문이다. 따라서, quote를 띄우는 작업을
main 큐에서 실행시킬 코드가 필요한 것이다.
코드
//
// ViewController.swift
// UsingURLSession
//
// Created by 이재영 on 2023/01/27.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func randomQuote(_ sender: Any) {
let url = URL(string: "https://api.kanye.rest/")!
let task = URLSession.shared.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
if let error = error {
print("Error", error)
return
}
let json = try! JSONSerialization.jsonObject(with: data!, options: []) as! [String: String]
DispatchQueue.main.async {
self.label.text = json["quote "]
}
}
task.resume()
}
}
프로젝트나 앱을 만들땐, network를 다루는 파일을 따로 분류해두는게 좋다.