api 요청해서 JSON 데이터받아오기

이재영·2023년 1월 27일
0

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를 다루는 파일을 따로 분류해두는게 좋다.
profile
기록

0개의 댓글