Intereting Posts
UITableView имеет нежелательную анимацию при вызове reloadData Расширение WatchKit с проблемами синхронизации Coredata Анекдоты APNS_SANDBOX деактивируются мгновенно на Amazon SNS share in-app купить на ios и Android Имеет ли Objective-C метод (или C-функцию), возвращающий спецификатор формата объекта для данного объекта? Автоматическое изменение размера таблицы Tableview для содержимого ячеек (SWIFT) Получение данных, отображение локального уведомления в одно и то же время каждый день Пользовательский интерфейс нарушается из-за вызова по умолчанию в iphone Как начать тест appium на симуляторе iOS? Ориентация устройства в Xcode не работает должным образом Как удалить столбец в Parse.com с помощью Swift Портал предоставления iOS: невозможно загрузить сертификаты Доступ к базе данных SQL из приложения iPhone через службу RESTful WCF Максимальная версия iOS для iOS Невозможно использовать UITableViewDataSource с пользовательской ячейкой

Многоадресная рассылка в 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 }