首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用moya_modelMapper映射moya结果

用moya_modelMapper映射moya结果
EN

Stack Overflow用户
提问于 2017-02-01 16:54:27
回答 1查看 978关注 0票数 1

我的webservice类中有以下函数:

代码语言:javascript
复制
 func loadTransport() -> Observable<[TransportResponse]> {
        let nonce = "\(Date().timeIntervalSince1970)"
        let csaKey = try! config.apikey()
        let csaSecret = try! config.apiSecret()

        let csaSignature = crypto.generateSignature(nonce: nonce, url: "http://*****/v1/nmbs", body: "", secret: csaSecret)
        print("SIGNATURE = \(csaSignature)")

        let endpointClosure = { (target: TransportService) -> Endpoint<TransportService> in
            let url = target.baseURL.appendingPathComponent(target.path).absoluteString
            let endpoint = Endpoint<TransportService>(URL: url, sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
            return endpoint.adding(newHttpHeaderFields: ["CSA-KEY": csaKey,"CSA-NONCE": nonce,"CSA-SIGNATURE": csaSignature])
        }



        let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
        return provider
            .request(TransportService.nmbs)
            .filterSuccessfulStatusCodes()
            .mapArray(type: TransportResponse.self)
    }

在我的TransportViewModel中,我有这个初始化方法:

代码语言:javascript
复制
 init(webService: Webservice) {
        self.webService = webService

        title.value = String.localizedString(key: "transport_title")



        transportResponse = active.asObservable()
            .filter { $0 }
            .flatMap {  _  in
                return webService.loadTransport()
            }
            .map { response in
                return [TransportData(items: response)]
        }    
    }

问题是它出现在我的flatMap方法中,但它从来没有出现在flatMap下面的map中。

当我将订阅部分添加到我的webservice函数时,如下所示:

代码语言:javascript
复制
 let provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
    provider
        .request(TransportService.nmbs)
        .filterSuccessfulStatusCodes()
        .mapArray(type: TransportResponse.self)
        .subscribe { event in
            switch event {
            case .next(let response):
                print(response)
            case .error(let error):
                print(error)
            default: break
            }
    }.addDisposableTo(disposeBag)

我看到我的响应被正确打印出来了。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 18:59:48

问题是,一旦loadTransport()方法完成,您的提供程序就会被释放。

您正在使用旧版本的Moya。直到这个错误被弱捕获,所以整个链根本不会发出任何事件( pull request / RxMoyaProvider /completed)。

为了解决这个问题,将提供者隐含到类范围的变量中:

代码语言:javascript
复制
class Webservice {
    var provider: RxMoyaProvider<TransportService>?
}

并像这样使用它:

代码语言:javascript
复制
self.provider = RxMoyaProvider<TransportService>(endpointClosure: endpointClosure, plugins: [NetworkLoggerPlugin(verbose: true)])
return self.provider!
    .request(TransportService.nmbs)
    .filterSuccessfulStatusCodes()
    .mapArray(type: TransportResponse.self)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41975515

复制
相关文章

相似问题

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