Avatar
Combine の Future って、非同期処理のコールバック代わりに使おうとすると、いちいち cancellable をどこかに保持しておかないといけなくて面倒じゃないですか?キャンセルしないとき。
3:20 AM
↓こういうのがあれば便利じゃないかと思ったんですが、どうでしょうか? 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? }
3:23 AM
↓使うとき。 let future = asyncFoo() future.get { foo in // cancellable は内部的に保持される // ... }