본문 바로가기
Ios

async-await / try

by 잘먹는 개발자 에단 2024. 8. 16.

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