https://developer.apple.com/documentation/combine/future
A publisher that eventually produces a single value and then finishes or fails.
하나의 값을 최종적으로 생성하고 완료되거나 실패하는 퍼블리셔입니다.
final class Future<Output, Failure> where Failure : Error
어떠한 작업을 수행하기 위해 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).") }
Swift 5.5부터 사용 가능한 async-await
구문과 통합하려면 Future
는 awaiting 호출자에 자신의 값을 제공할 수 있습니다. 이것이 Publisher
를 따르거나 잠재적으로 많은 요소들을 퍼블리시하는 타입과 달리 특히 유용한 이유는 Future
가 오직 하나의 요소(혹은 실패)만 퍼블리시하기 때문입니다. 값 속성을 사용해서 위 호출은 아래와 같습니다.
let number = await generateAsyncRandomNumberFromFuture().value
print("Got random number \(number).")
스위프트에 있는 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)
}
}
}
이 메소드의 호출 시점은 Future
의 sink
Subscriber가 하는 것과 같은 클로저를 사용하지 않습니다. 간단하게 기다리고 결과를 할당합니다.
let asyncRandom = await generateAsyncRandomNumberFromContinuation()
더 많은 정보는 아래 링크를 보시기 바랍니다.
Concurrency
doc://com.apple.documentation/documentation/swift/swift_standard_library/concurrency