Future
って、非同期処理のコールバック代わりに使おうとすると、いちいち cancellable
をどこかに保持しておかないといけなくて面倒じゃないですか?キャンセルしないとき。extension Future { public func get(_ body: @escaping (Result<Output, Failure>) -> Void) { let keep: Keep<AnyCancellable> = .init() keep.value = sink(receiveCompletion: { completion in switch completion { case .finished: break case .failure(let error): body(.failure(error)) } keep.value = nil }, receiveValue: { output in body(.success(output)) }) } } private class Keep<Value> { var value: Value? }
let future = asyncFoo() future.get { foo in // cancellable は内部的に保持される // ... }