我对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的理解。见下面的答案。
发布于 2015-06-27 09:12:05
原来,我的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。
https://stackoverflow.com/questions/31082879
复制相似问题