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

时间:2015-06-26 22:09:56

标签: ios swift reactive-cocoa frp

我对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的理解。请参阅下面的答案。

1 个答案:

答案 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