Slide 13
Slide 13 text
CombineのOperatorを利用した処理を置き換える場合(2)
Combineでよくある処理例をasync/awaitへ置き換える簡単な事例(Zip)
2. Zipを利用して処理1・処理2・処理3全ての処理完了を待って処理する場合:
func firstPublisher() -> AnyPublisher {
return Future { promise in
promise(.success(T1()))
}
.eraseToAnyPublisher()
}
func secondPublisher() -> AnyPublisher {
return Future { promise in
promise(.success(T2()))
}
.eraseToAnyPublisher()
}
func thirdPublisher() -> AnyPublisher {
return Future { promise in
promise(.success(T3()))
}
.eraseToAnyPublisher()
}
let zippedPublisher = Publishers.Zip3(
firstPublisher(),
secondPublisher(),
thirdPublisher()
)
.sink(receiveCompletion: { result in
// 完了時or失敗時のHandling処理
}, receiveValue: { t1, t2, t3 in
// T1,T2,T3型の値を利用した処理
})
※ Zipを利用した並列処理は良く利用されるものではあるが、一度に結合できる処理数の制限があるので注意が必要。
async/awaitに変換した場合:
async let firstResult = try await first()
async let secondResult = try await second()
async let thirdResult = try await third()
// T1,T2,T3型の値を利用した処理
AnyPublisherで作成している処理部分を
async throws -> T で記述するイメージです。
※ do ~ catch 内で下記の様な処理を実行
処理内の途中段階でErrorが発生した場合には
catch内に記述した処理が実行されます。