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:) 메서드를 사용하여 데이터를 가져오는 작업을 수행합니다.
네트워크 통신은 비동기적으로 이루어지므로, 함수가 실행될 때 데이터가 바로 사용 가능한 것이 아닙니다. 데이터가 도착하면 클로저 내부의 코드가 실행되어야 합니다.
DispatchQueue.main.async {
}
메인 스레드에서 실행되어야 하는 UI 업데이트나 사용자 이벤트 처리 외의 작업을 메인 스레드에서 동기적으로 실행하면 앱의 반응성이 떨어질 수 있습니다.
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()
}