📌

【Swift】Combine Publishers

2023/11/06に公開

作成中

Concatenate

Future

宣言から3秒後にfuturePublisherが「Just("成功しました")」、もしくは「Just(.failure(SomeError()))」に変化するといったイメージか

import Combine
struct SomeError: Error {}

let futurePublisher: Future<String, SomeError> = Future { promise in
    DispatchQueue.global().asyncAfter(deadline: .now() + 3) {
        if Bool.random() {
            return promise(.success("成功しました。"))
        } else {
            return promise(.failure(SomeError()))
        }
    }
}

let cancellable = futurePublisher
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Finished.")
        case .failure(let error):
            print("error: \(error)")
        }
    }, receiveValue: { value in
        print("value: \(value)")
    })

Deferred

購読されるまで内部のパブリッシャの生成を遅延する

import Combine

func getNumer() -> Int {
    Thread.sleep(forTimeInterval: 5)
    return 10
}

print("publisher1の作成開始")
let publisher1 = Just(getNumer())  // numberの取得に5秒かかる
print("publisher1の作成完了")


print("publisher2の作成開始")
let publisher2 = Deferred {
    return Just(getNumer())
}
print("Deferredは、実際に購読されるまで中のPublisherを生成しない。そのため、一瞬で終わる。")

Discussion