URLSession으로 데이터 가져오기

개발렬·2023년 7월 24일
0

UIKit

목록 보기
1/6
post-thumbnail

Data Taks, Download Task 두 가지 방법

Data Task

guard let url = URL(string: "https://api.example.com/data") else { return }
        
        let session = URLSession.shared
        let task = session.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("에러 발생: \(error.localizedDescription)")
                return
            }
            
            guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                return
            }
            
            guard let data = data else {
                print("데이터 없음")
                return
            }
            
            // 데이터 사용
            print("서버로부터 받은 데이터: \(data)")
        }
        
        task.resume()
    }

서버로부터 데이터를 가져오는 비동기 작업을 수행합니다.
함수 내부에서 URLSession을 생성하고, dataTask(with:completionHandler:) 메서드를 사용하여 데이터를 가져오는 작업을 수행합니다.

  1. URL 객체가 유효한지 확인합니다.
  2. URLSession 클래스의 shared 인스턴스를 사용하여 기본 섹션을 생성합니다. 이렇게 함으로써 네트워크 요청이 겹치거나 자원이 낭비되는 것을 방지할 수 있습니다. URLSession.shared를 통해 앱 어디서든 동일한 인스턴스에 접근할 수 있습니다.
  3. dataTask(with:completionHandler:) 메서드를 호출하여 서버로부터 데이터를 비동기적으로 가져옵니다.
    클로저를 사용하여 응답이 도착했을 때 실행될 코드를 정의합니다.
  4. task.resume()을 활용하여 URLSession에서 비동기적으로 실행되는 데이터 요청을 시작합니다.

dataTask(with:completionHandler:)에 대하여

  • data: 서버로부터 받은 데이터를 포함하는 Data 객체
  • response: 서버의 응답에 대한 정보를 포함하는 HTTPURLResponse 객체
  • error: 에러 발생 시 해당 에러를 포함하는 Error 객체
    클로저 내부에 에러가 있는지 확인을 하고, 데이터가 정상적으로 받아졌는지 확인을 합니다.
    데이터가 정상적으로 받아진 경우, 해당 데이터를 원하는 작업을 수행합니다.

비동기적으로 메인 스레드에서 UI 업데이트

네트워크 통신은 비동기적으로 이루어지므로, 함수가 실행될 때 데이터가 바로 사용 가능한 것이 아닙니다. 데이터가 도착하면 클로저 내부의 코드가 실행되어야 합니다.

DispatchQueue.main.async {
}

메인 스레드에서 실행되어야 하는 UI 업데이트나 사용자 이벤트 처리 외의 작업을 메인 스레드에서 동기적으로 실행하면 앱의 반응성이 떨어질 수 있습니다.


Download Task

func downloadFileFromServer() {
        guard let url = URL(string: "https://example.com/image.jpg") else { return }
        
        let session = URLSession.shared
        let task = session.downloadTask(with: url) { (localURL, response, error) in
            if let error = error {
                print("에러 발생: \(error.localizedDescription)")
                return
            }
            
            guard let localURL = localURL else {
                print("파일 다운로드 실패")
                return
            }
            
            // 파일 사용 (임시 디렉토리에 저장된 파일의 경로)
            print("다운로드된 파일 경로: \(localURL)")
        }
        
        task.resume()
    }
profile
iOS, Flutter를 공부해 보자

0개의 댓글

관련 채용 정보