[swift] Swift PromiseKit과 코루틴

소개

앱 개발에서 비동기 작업은 매우 중요한 부분입니다. Swift에서는 비동기 작업을 처리하기 위해 PromiseKit과 코루틴을 사용할 수 있습니다. 이 기술들은 간편하게 비동기 작업을 처리하고 결과를 다룰 수 있도록 도와줍니다.

PromiseKit

PromiseKit은 Swift에서 비동기 작업을 다루기 위한 라이브러리입니다. PromiseKit을 사용하면 비동기 작업을 간단하게 순차적으로 실행하고 결과를 다룰 수 있습니다. PromiseKit은 대부분의 비동기 작업을 처리하기 위한 메서드를 제공하며, 체이닝을 통해 작업을 순차적으로 실행할 수 있습니다.

아래는 PromiseKit을 사용하여 비동기 작업을 처리하는 예제입니다.

import PromiseKit

func getData() -> Promise<Data> {
    return Promise { seal in
        // 비동기 작업 실행
        DispatchQueue.global().async {
            // 비동기 작업 완료 후 결과를 seal에 전달
            if let data = ... { // 비동기 작업 결과
                seal.fulfill(data)
            } else {
                seal.reject(Error.unknown)
            }
        }
    }
}

getData().done { data in
    // 비동기 작업이 성공적으로 완료된 경우
    // data 처리
}.catch { error in
    // 비동기 작업이 실패한 경우
    // error 처리
}

위 예제에서 getData() 함수는 비동기 작업을 수행하는데 사용되는 Promise 객체를 반환합니다. Promise 객체에서 done 블록은 작업이 성공적으로 완료된 경우 실행되고, catch 블록은 작업이 실패한 경우 실행됩니다.

코루틴

Swift 에서 코루틴은 비동기 작업을 순차적으로 실행하는 또 다른 방법입니다. 코루틴은 여러 개의 비동기 작업을 순차적으로 실행하고, 작업간의 상태를 유지하는데 유용합니다.

코루틴을 사용하면 코드의 가독성을 높일 수 있으며, 비동기 작업을 순차적으로 실행하는 과정을 단순화시킬 수 있습니다.

아래는 Swift의 코루틴을 사용하여 비동기 작업을 처리하는 예제입니다. (Swift 5.5 이상)

actor DataFetcher {
    func fetchData() async -> Data {
        return await withCheckedContinuation { continuation in
            // 비동기 작업 실행
            DispatchQueue.global().async {
                // 비동기 작업 완료 후 결과를 continuation에 전달
                if let data = ... { // 비동기 작업 결과
                    continuation.resume(returning: data)
                } else {
                    continuation.resume(throwing: Error.unknown)
                }
            }
        }
    }
}

func getData() async {
    let dataFetcher = DataFetcher()
    do {
        let data = try await dataFetcher.fetchData()
        // 비동기 작업이 성공적으로 완료된 경우
        // data 처리
    } catch {
        // 비동기 작업이 실패한 경우
        // error 처리
    }
}

위 예제에서 fetchData() 메서드는 코루틴을 사용하여 비동기 작업을 처리합니다. withCheckedContinuation 함수를 통해 비동기 작업을 실행하고, 결과를 continuation에 전달하여 작업을 완료합니다. getData() 함수에서는 fetchData()를 호출하고, 결과에 따라 데이터를 처리합니다.

결론

Swift에서 비동기 작업을 다루기 위해 PromiseKit과 코루틴을 사용할 수 있습니다. PromiseKit은 비동기 작업을 순차적으로 처리하고 결과를 다루는 데 편리한 라이브러리입니다. 코루틴은 비동기 작업을 순차적으로 실행하고 작업간의 상태를 유지하는데 유용한 기술입니다. 어떤 방식을 선택할지는 개발자의 취향과 상황에 따라 다르지만, 두 기술 모두 비동기 작업을 간편하게 처리할 수 있습니다.

참고 자료