ReactiveCocoa 3:将信号映射到值 (Swift)

ReactiveCocoa 3: Map signal to value (Swift)

我是 ReactiveCocoa 3 的新手,Swift 有以下代码示例。我想映射从 map 函数返回的信号以在最后接收 start 函数中的 JSON 值。

目前我正在通过一个 Signal<JSON, NSError>,我在 start 函数中 observe。对此有更好的解决方案吗?

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的理解有问题。请参阅下面我的回答。

原来我的 Api.get() 函数应该 return 一个 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.