Future

Horus-iOS·2022년 12월 27일
0

Combine

목록 보기
4/9

https://developer.apple.com/documentation/combine/future

A publisher that eventually produces a single value and then finishes or fails.

하나의 값을 최종적으로 생성하고 완료되거나 실패하는 퍼블리셔입니다.

Declaration

final class Future<Output, Failure> where Failure : Error

Overview

어떠한 작업을 수행하기 위해 Future를 사용하고 이후 비동기로 단일 요소를 퍼블리시할 수 있습니다. Future.Promise를 갖는 클로저와 함께 Future를 초기화할 수 있습니다. 클로저는 성공 혹은 실패 여부를 나타내는 Result를 갖는 promise를 호출합니다. 성공한 경우 Futre의 다운스트림 Subscriber는 퍼블리시 스트림이 정상적으로 완료되기 전에 요소를 받습니다. 결과가 오류이면 퍼블리싱은 오류와 함께 종료됩니다.

아래 예시는 약간의 딜레이 후 랜덤 숫자를 비동기로 퍼블리시하는 Fututre 사용 메소드를 보여줍니다.

func generateAsyncRandomNumberFromFuture() -> Future <Int, Never> {
    return Future() { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            let number = Int.random(in: 1...10)
            promise(Result.success(number))
        }
    }
}

퍼블리시된 값을 받으려면 아래처럼 Subscribers.Sink와 같은 컴바인 Subscriber를 사용해야 합니다.

cancellable = generateAsyncRandomNumberFromFuture()
    .sink { number in print("Got random number \(number).") }

Integrating with Swift Concurrency

Swift 5.5부터 사용 가능한 async-await 구문과 통합하려면 Future는 awaiting 호출자에 자신의 값을 제공할 수 있습니다. 이것이 Publisher를 따르거나 잠재적으로 많은 요소들을 퍼블리시하는 타입과 달리 특히 유용한 이유는 Future가 오직 하나의 요소(혹은 실패)만 퍼블리시하기 때문입니다. 값 속성을 사용해서 위 호출은 아래와 같습니다.

let number = await generateAsyncRandomNumberFromFuture().value
print("Got random number \(number).")

Alternatives to Futures

스위프트에 있는 async-await 구문은 비동기 작업 완료 후 몇 가지 작업을 수행하길 원하는 경우를 위해 Future의 전체적인 사용을 대체할 수도 있습니다.

함수 withCheckedContinuation(function:_:)와 이 함수의 오류처리를 통해 구현할 수 있습니다. 아래 예시는 위 예시처럼 Future를 통해 비동기 랜덤 숫자 생성을 수행하지만 async 메소드로 수행합니다.

func generateAsyncRandomNumberFromContinuation() async -> Int {
    return await withCheckedContinuation { continuation in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            let number = Int.random(in: 1...10)
            continuation.resume(returning: number)
        }
    }
}

이 메소드의 호출 시점은 Futuresink Subscriber가 하는 것과 같은 클로저를 사용하지 않습니다. 간단하게 기다리고 결과를 할당합니다.

let asyncRandom = await generateAsyncRandomNumberFromContinuation()

더 많은 정보는 아래 링크를 보시기 바랍니다.

Concurrency
doc://com.apple.documentation/documentation/swift/swift_standard_library/concurrency

0개의 댓글