簡體   English   中英

SwiftUI Combine Framework 共享receiveCompletion 代碼塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM