Ios 反应3:将信号映射到值(Swift)
我对reactivecococoa3和Swift非常陌生,下面是代码示例。我想映射map函数返回的信号,以便在末尾的start函数中接收JSON值 此时,我正在传递一个信号,我在启动函数中观察到了这个信号。有更好的解决办法吗Ios 反应3:将信号映射到值(Swift),ios,swift,reactive-cocoa,frp,Ios,Swift,Reactive Cocoa,Frp,我对reactivecococoa3和Swift非常陌生,下面是代码示例。我想映射map函数返回的信号,以便在末尾的start函数中接收JSON值 此时,我正在传递一个信号,我在启动函数中观察到了这个信号。有更好的解决办法吗 import Foundation import ReactiveCocoa import SwiftyJSON class SearchViewModel { let results = MutableProperty<[MyModel]>([])
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)
}
)
}
)
}
}
更新:
原来问题是我对反应可可的理解。请参阅下面的答案。结果表明,我的Api.get函数应该返回一个SignalProducer,而不是一个信号。通过这种调整,我最终得到了如下解决方案:
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您还需要将属性生成器的错误从NoError重新映射到NSError