Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 反应3:将信号映射到值(Swift)_Ios_Swift_Reactive Cocoa_Frp - Fatal编程技术网

Ios 反应3:将信号映射到值(Swift)

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]>([])

我对reactivecococoa3和Swift非常陌生,下面是代码示例。我想映射map函数返回的信号,以便在末尾的start函数中接收JSON值

此时,我正在传递一个信号,我在启动函数中观察到了这个信号。有更好的解决办法吗

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