Как отобразить значения и ошибки на 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 вещи, так что давайте идти по очереди:

  1. Исходя из Void в Bool

Если у вас есть foo: SignalProducer<Void, Error>:

let bar: SignalProducer<Bool, Error> = foo.map { _ in true}
  1. Исходя из 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 }
  1. Должен ли NetworkError всплывать до контроллера, чтобы он мог отображать ошибку в диалоговом окне?

В конце концов вы должны преобразовать ошибку в нечто читаемое. Контроллер (если мы говорим о UIViewController), может использовать вторичную сущность для перевода этой ошибки в строку или пару строк (заголовок + тело). Если вы используете MVVM, ViewModel будет это преобразование.

Другие вопросы по тегам