[swift] 비동기 작업에서의 에러 처리 방법 비교

비동기 작업을 수행할 때는 에러 처리 방법이 매우 중요합니다. 비동기 작업 중에 발생하는 에러를 효율적으로 처리하는 방법을 알아보겠습니다.

1. Completion Handler를 이용한 방법

func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
    // 비동기 작업 수행
    // 에러 발생 시 completion에 에러 전달
    // 성공 시 completion에 데이터 전달
}

// 사용 예시
fetchData { result in
    switch result {
        case .success(let data):
            // 데이터 처리
        case .failure(let error):
            // 에러 처리
    }
}

비동기 작업을 수행하는 함수에서 completion handler를 사용하여 성공 시 데이터를 전달하고, 에러 발생 시 해당 에러를 전달하는 방법입니다. 이 방법은 간단하고 직관적인 방법이지만, 성공과 에러를 명확하게 나누어 처리해야 하기 때문에 코드가 복잡해질 수 있습니다.

2. Result 타입을 반환하는 방법

func fetchData() -> Result<Data, Error> {
    // 비동기 작업 수행
    // 성공 시 .success에 데이터 반환
    // 에러 발생 시 .failure에 에러 반환
}

// 사용 예시
let result = fetchData()
switch result {
    case .success(let data):
        // 데이터 처리
    case .failure(let error):
        // 에러 처리
}

비동기 작업을 수행하는 함수가 Result 타입을 반환하도록 작성하는 방법입니다. 성공 시 .success에 데이터를 반환하고, 에러 발생 시 .failure에 에러를 반환합니다. 이 방법은 비동기 작업의 결과를 명확하게 반환하기 때문에 에러 처리가 간편하지만, Result 타입을 처리하는 코드를 추가로 작성해야 하는 단점이 있습니다.

3. Combine 프레임워크를 이용한 방법

Swift의 Combine 프레임워크를 사용하면 비동기 작업과 에러 처리를 효율적으로 처리할 수 있습니다.

import Combine

func fetchData() -> Future<Data, Error> {
    return Future<Data, Error> { promise in
        // 비동기 작업 수행
        // 성공 시 promise(.success)에 데이터 반환
        // 에러 발생 시 promise(.failure)에 에러 반환
    }
}

// 사용 예시
fetchData()
    .sink(receiveCompletion: { completion in
        switch completion {
            case .finished:
                // 작업 완료
            case .failure(let error):
                // 에러 처리
        }
    }, receiveValue: { data in
        // 데이터 처리
    })

Combine 프레임워크의 Future 타입을 사용하여 비동기 작업과 에러 처리를 효율적으로 처리할 수 있습니다. Future는 비동기 작업의 결과와 에러를 처리하는 sink 함수를 제공하므로, 작업의 결과를 처리하는 클로저와 에러를 처리하는 클로저를 간단하게 작성할 수 있습니다.

참고 자료: