簡體   English   中英

ReactiveCocoa 3和ReactiveCocoa 4中的組播

[英]Multicasting in ReactiveCocoa 3 and ReactiveCocoa 4

假設我有一個返回SignalProducer<AnyObject?, NSError>的函數,並且我想將生產者綁定到多個MutableProperty<String> 因此,如下所示:

let foo = SignalProducer<AnyObject?, NSError>(value: nil)
let someProperty1 = MutableProperty<String>("")
let someProperty2 = MutableProperty<String>("")

someProperty1 <~ foo
    .flatMapError { _ in
        SignalProducer<AnyObject?, NoError>.empty
    }
    .map { _ in
        return "test"
    }

// someProperty2 <~ foo etc...

為了避免我的功能(例如某些網絡設備)被多次運行,我將需要使用多播。 據我從CHANGELOG得知startWithSignal是用於此的運算符。 但是,我似乎無法弄清楚如何以聲明的方式進行此操作。

因此,一種方法可能是在startWithSignal的關閉過程中進行startWithSignal

foo.startWithSignal { signal, disposable in
    someProperty1 <~ signal
        .map { _ in
            return "test"
        }

    // someProperty2 <~ signal etc...
}

但是,這顯然會失敗,因為我們需要擺脫NSError部分。 因為我們要提供一個Signal (與SignalProducer相對),所以我們不能使用flatMapError (在RAC4中,在RAC3中catch )。 而且我看不到mapError如何為我們做到這一點? 最后,我什至不確定這是否是在RAC3 / RAC4中處理多播的正確方法?

任何幫助深表感謝。

starWithSignal之前使用flatMapError (以及必須使用SignalProducer參數的任何其他運算符)

let fooIgnoreError = foo
    .flatMapError { _ in
        SignalProducer<AnyObject?, NoError>.empty
    }


fooIgnoreError.startWithSignal { signal, disposable in
    someProperty1 <~ signal.map { _ in "test" }
    someProperty2 <~ signal.map { _ in "test2" }
}

如果fooIgnoreError僅啟動一次,則可以保證基礎信號生成器foo也只能啟動一次。

在這里通過示例解釋了如何實現多播

對於錯誤,可以使屬性AnyProperty<Result<Value, Error>>能夠轉發錯誤。 如果您希望信號在發生故障時終止,則只需

signal.flatMapError { error in 
    fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error?
    return .empty
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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