【问题标题】:ReactiveCocoa 3: Map signal to value (Swift)ReactiveCocoa 3:将信号映射到值(Swift)
【发布时间】:2015-06-26 22:09:55
【问题描述】:

我对 ReactiveCocoa 3 和 Swift 还很陌生,并且有以下代码示例。我想将map函数返回的信号映射到最后在start函数中接收JSON值。

目前我正在通过Signal<JSON, NSError>,我在observe 内部start 函数。有没有更好的解决方案?

import Foundation
import ReactiveCocoa
import SwiftyJSON

class SearchViewModel {

    let results = MutableProperty<[MyModel]>([])
    let searchText = MutableProperty<String>("")

    init() {
        searchText.producer
            |> map { keyword -> Signal<JSON, NSError> in Api().get("search/\(keyword)") }
            |> start(
                next: { signal in
                    signal
                        |> observe(
                            next: { jsonArray in
                                let models = jsonArray.arrayValue.map(modelAdapter)

                                self.results.put(models)
                            }
                    )
                }
        )

    }

}

更新:

原来问题出在我对 ReactiveCocoa 的理解上。请参阅下面的答案。

【问题讨论】:

    标签: ios swift reactive-cocoa frp


    【解决方案1】:

    原来我的Api.get() 函数应该返回SignalProducer 而不是Signal。通过这种调整,我最终得到了这样的解决方案:

    let keywordToJson: SignalProducer<String, NSError>  -> SignalProducer<JSON, NSError> = flatMap(.Concat) { keyword in Api().get("search/\(keyword)" }
    
    searchText.producer
        |> mapError { _ in NSError() }
        |> keywordToJson
        |> start(
            next: { jsonArray in
                let models = jsonArray.arrayValue.map(modelAdapter)
    
                self.results.put(models)
            }
    )
    

    注意事项:
    (1) 目前,您似乎有必要给编译器一些关于flatMap 函数类型的提示。
    (2) 您还需要将属性producer 的错误从NoError 重新映射到NSError

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多