首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactiveCocoa 3:将信号映射为值(Swift)

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

Stack Overflow用户
提问于 2015-06-26 22:09:55
回答 1查看 751关注 0票数 1

我对ReactiveCocoa 3和Swift非常陌生,我有下面的代码示例。我想映射从map函数返回的信号,以便在最后接收start函数中的JSON值。

目前,我正在传递一个Signal<JSON, NSError>observestart函数中。有什么更好的解决办法吗?

代码语言:javascript
复制
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的理解。见下面的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-27 09:12:05

原来,我的Api.get()函数应该返回一个SignalProducer而不是一个Signal。通过这种调整,我最终得到了这样的解决方案:

代码语言:javascript
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31082879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档