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
.
我是 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
.