[英]SwiftUI Combine Framework shared receiveCompletion code block
在 SwiftUI 訂閱者中,您通常會擁有這個
authenticate
.receive(on: DispatchQueue.main) // Move to the main thread
.sink(receiveCompletion: { completion in
switch completion {
case .failure(let error): ()
case .finished: ()
}
}, receiveValue: { _ in })
我想提取要在多個訂閱者之間共享的 receiveCompletion 代碼塊,期望相同的完成,即下面要分開並在多個訂閱者中使用。
receiveCompletion: { completion in
switch completion {
case .failure(let error): ()
case .finished: ()
}
您可以編寫簡單的函數來封裝邏輯:
extension Publisher where Failure == Never {
public func sinkOnMain(
receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable {
receive(on: RunLoop.main)
.sink(receiveValue: receiveValue)
}
}
extension Publisher {
public func sinkOnMain(
receiveCompletion: @escaping ((Subscribers.Completion<Self.Failure>) -> Void),
receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable {
receive(on: RunLoop.main)
.sink(receiveCompletion: receiveCompletion, receiveValue: receiveValue)
}
}
它們都做與常規接收sink
相同的工作,但首先將執行移動到主運行循環。
這就是我要找的
static func handleCompletion(completion: Subscribers.Completion<Error>) {
switch completion {
case .failure(let error): ()
case .finished: ()
}
}
然后這樣調用
authenticate
.receive(on: DispatchQueue.main) // Move to the main thread
.sink(receiveCompletion: handleCompletion
, receiveValue: { _ in })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.