Как отобразить значения и ошибки на SignalProducer
Как мне сопоставить это
func save() -> SignalProducer<Void, NetworkError>
в
var saveAction: Action<AnyObject, Bool, NoError>
я немного запутался с синтаксисом
service.save()
.observeOn(QueueScheduler.mainQueueScheduler)
.map<Bool>( _ in true) // how to map void to bool
.flatMapError {
error in
// how to map to a NoError?
}
Кроме того, что должно быть лучшей практикой в использовании действий? Должен ли NetworkError всплывать до контроллера, чтобы он мог отображать ошибку в диалоговом окне?
1 ответ
Вы спрашиваете 3 вещи, так что давайте идти по очереди:
- Исходя из
Void
вBool
Если у вас есть foo: SignalProducer<Void, Error>
:
let bar: SignalProducer<Bool, Error> = foo.map { _ in true}
- Исходя из
NetworkError
кNoError
Это не интуитивно понятно, но вы можете использовать вывод типа Swift и сделать что-то вроде этого:
let bar: SignalProducer<Void, NoError> = foo.flatMapError { _ in SignalProducer.empty }
Ваш func save() -> SignalProducer<Void, NetworkError>
затем может стать:
let save: SignalProducer<Void, NetworkError> = ...
let newSave: SignalProducer<Bool, NoError> = save.map {_ in true}.flatMapError { _ in SignalProducer.empty }
- Должен ли NetworkError всплывать до контроллера, чтобы он мог отображать ошибку в диалоговом окне?
В конце концов вы должны преобразовать ошибку в нечто читаемое. Контроллер (если мы говорим о UIViewController
), может использовать вторичную сущность для перевода этой ошибки в строку или пару строк (заголовок + тело). Если вы используете MVVM, ViewModel будет это преобразование.