Swift에서의 async / await
- async와 await은 스위프트에서 비동기 코드를 동기식으로 작성할 수 있도록 도와줍니다.
- 이전엔 비동기 작업을 처리하기 위해서 콜백이나 Completion Handler를 사용해야 했지만, 코드가 복잡해지고 가독성이 떨어집니다. 콜백 지옥..
- 반면에, async await을 사용하면 비동기 작업이 마치 동기 작업처럼 보이게 작성할 수 있습니다.
- async : 함수나 메서드가 비동기적으로 실행됨을 나타냅니다. 이 키워드를 사용하면 해당 함수가 비동기 함수가 되어, 호출시에 await 키워드를 사용해야 합니다.
- await : 비동기 함수나 작업의 결과를 기다립니다. 이 키워드는 async 함수 안에서만 사용될 수 있습니다.
// 비동기 함수의 예
func fetchData() async -> String {
// 네트워크 요청 시뮬레이션 (1초 대기)
await Task.sleep(1_000_000_000)
return "Data from server"
}
// 비동기 함수를 호출하는 예
func loadData() async {
let data = await fetchData()
print(data) // "Data from server"
}
try
- try는 오류가 발생할 수 있는 코드에 대해서 오류를 처리하도록 도와줍니다.
- 스위프트에서 함수나 메서드가 오류를 던질 수 있다면, 해당 함수는 throws를 명시해야합니다. 그리고 이를 호출할 때는 try 키워드를 사용해야 합니다.
- try
오류를 발생시킬 수 있는 함수나 메서드를 호출할 때 사용됩니다.
이 키워드는 해당 함수가 오류를 던질 가능성이 있음을 나타내며, 오류가 발생하면 이를 처리하거나 전달할 수 있습니다.
- try?
오류가 발생할 수 있는 작업을 시도하고, 오류가 발생하면 nil을 반환합니다.
이는 오류를 무시하고 계속 진행하고자 할 때 유용합니다.
- try!
왠만하면 사용하지 않습니다.
오류가 발생하지 않음을 확신할 때 사용되며, 오류가 발생하면 프로그램이 충돌하며 멈춥니다.
// throws : 해당 함수가 특정 조건이 만족되지 않거나 어떠한 상황에서 오류를 던질 수 있음을 명시합니다.
// 그래서 이 함수를 사용하는 사람이 오류가 발생할 가능성을 염두에 두고 코드를 짤 수 있게 도와줍니다.
// throws 키워드가 붙은 함수를 호출할 때는 !반드시! try 키워드를 사용해야 합니다.
func loadDataFromFile() throws -> String{
let filePath = "path/to/file"
guard let fileData = try? String(contentsOfFile : filePath) else{
throw NSError(domain: "FileNotFound", code : 404, userInfo : nil)
}
return fileData
}
func fetchData() async{
do{
let data = try loadDataFromFile()
print(data)
}catch{
print("Failed to load data : \(error)")
}
}
UI kit에서의 활용
- UI kit에서는 비동기 작업이 자주 발생합니다.
- 예를 들어서, 네트워크 요청이라던지 파일 읽기/쓰기 혹은 이미지를 비동기적으로 로드하는 작업 등이 이에 해당합니다.
- 이 때 async/await과 try를 사용하면 코드의 간결성과 가독성을 크게 높일 수 있습니다.
예를 들어서 이미지 로딩과 같은 작업은 다음과 같이 작성할 수 있습니다.
func loadImage() async throws -> UIImage{
// async throws 순서 지켜야합니당
let url = URL(string:"이미지 url")!
let (data, _) = try await URLSession.shared.data(from : url)
// 1. try - 개별 호출시마다
// js와 다르게 swift는 try 키워드를 개별 호출에 적용한다.
// 잠재적으로 오류를 던질 수 있는 함수에 바로 붙여서 사용한다.
// 여러 줄의 코드가 오류를 던질 수 있다면 각 줄마다 try를 붙여야한다.
// 여러개의 호출을 묶어서 오류처리하려면 do-catch를 사용한다.
// 2. let (data, _)
// _는 값을 무시할 때 사용된다. 어떤 값이 반환되지만 그 값을 사용하지 않을 때
// (data, _) : 튜플
guard let image = UIImage(data : data) else{
throw NSError(domain : "InvalidImageData", code : 100, useInfo : nil)
}
return image
}
func updateUIWithImage() async{
do{
let image = try await loadImage()
imageView.image = image
}catch{
print("Error loading image : \(error)")
}
}
'Ios' 카테고리의 다른 글
클로저에 대해서 알아보자 (0) | 2024.08.16 |
---|---|
self에 대해서 알아보자 (0) | 2024.08.16 |
struct 그리고 class (0) | 2024.08.16 |
as에 대해서 알아보자 (0) | 2024.08.16 |
DispatchQueue에 대해서 알아보자! (0) | 2024.08.16 |