Intereting Posts
Swift json некоторые клавиши с кавычками некоторые без как найти самые близкие местоположения от 5 до 10 м от массива местоположений в iOS? Ключ iOS не восстановлен Как ловить исключения происходят из-за того, что они не соответствуют протоколу NSCoding в Objective-c? Объявление 2D-массива в Objective-C ++ ошибке Стандартная настройка Parse.com дает предупреждение «Выполняется длительная работа …» Segue нажатие Ничего первого раза (задержка в отправленных данных) Amazon Web Services Fatal Error at Run Time "dyld: библиотека не загружена" Swift 2.2 Как изменить значение переменной NSURL при отладке с помощью LLVM в XCode с помощью команды expr? xcode Provisioning Файл не найден с Jenkins Можете ли вы обмениваться данными через профили обеспечения, используя цепочку ключей? Как создать zip папки и файла в IOS? Как получить понедельник 00:00 текущей недели? Swift 3 Изменение rootViewController против текущего ModalViewController Индикатор активности в UINavigationBar

Многоадресная рассылка в ReactiveCocoa 3 и ReactiveCocoa 4

Пр&#x435;дположим, у меня есть функция, которая возвращает 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 :

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

Однако это, очевидно, потерпит неудачу, потому что нам нужно избавиться от части NSError . Поскольку мы даем Signal (против SignalProducer ), мы не можем использовать flatMapError (в RAC4, catch в RAC3). И я не вижу, как mapError может это сделать для нас? Наконец, я даже не уверен, что это правильный способ обработки многоадресной рассылки в RAC3 / RAC4?

Буду признателен за любую оказанную помощь.

Используйте flatMapError (и любые другие операторы, которые должны принимать аргумент SignalProducer ) перед starWithSignal

 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 запускается только один раз, ваш базовый 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 }