如何在SignalProducer上映射值和错误

时间:2016-03-22 15:55:24

标签: ios swift reactive-cocoa reactive-cocoa-3 reactive-cocoa-4

如何映射

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 个答案:

答案 0 :(得分:2)

你问了3件事,所以让我们一个接一个地去:

  
      
  1. Void转到Bool
  2.   

假设您有foo: SignalProducer<Void, Error>

let bar: SignalProducer<Bool, Error> = foo.map { _ in true}
  
      
  1. NetworkError转到NoError
  2.   

这不直观,但您可以使用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冒泡到控制器,那么它可以在弹出对话框中显示错误吗?
  2.   

最终您必须将错误转换为可读的内容。 Controller(假设我们正在讨论UIViewController),可以利用辅助实体将此错误转换为字符串或一对字符串(title + body)。如果你正在使用MVVM,那么ViewModel就会进行转换。