我对ReactiveCocoa 3和Swift很新,并有以下代码示例。我想映射map
函数返回的信号,以便在最后接收JSON
函数中的start
值。
目前我正在通过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)
}
)
}
)
}
}
。有更好的解决方案吗?
from datetime import datetime
A=['4/21/2015', '10/14/2014', '9/16/2014', '7/10/2014', '8/11/2014', '8/3/2014', '7/20/2014', '7/6/2014', '4/21/2015', '4/21/2015']
FORMAT = '%m/%d/%Y'
# create a list of sorted datetime objects
sorted_dates = sorted([datetime.strptime(d, FORMAT) for d in A])
原来问题是我对ReactiveCocoa的理解。请参阅下面的答案。
答案 0 :(得分:-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
。