首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxSwift中的RAC tryMap替代方案

RxSwift中的RAC tryMap替代方案
EN

Stack Overflow用户
提问于 2016-04-12 00:22:23
回答 2查看 312关注 0票数 2

在RxSwift中实施tryMap-like功能的推荐方法是什么?

下面的代码是我如何将json对象映射到内部响应包装器类的。如果响应不符合某些条件,则会返回nil,这会变成一个错误事件(tryMap实现)。

代码语言:javascript
复制
extension RACSignal{
    
    func mapToAPIResponse() -> RACSignal{
        return tryMap({ (object) -> AnyObject! in
            if let data = object as? [String:AnyObject]{
                //Some Logic
                return data["key"]
            }
            return nil
        })
    }
}

这应该如何在RxSwift中实现?

更新-可能的解决方案

我为Rx-Swift提出了以下解决方案。开放以获得更好的解决方案。

代码语言:javascript
复制
extension Observable{
    
    func mapToAPIResponse() -> Observable<APIResponse>{
        return map({ (object) in
            
            guard let dictionary = object as? [String:AnyObject] else{
                //APIResponseError.InvalidResponseFormat is defined in other class.
                throw APIResponseError.InvalidResponseFormat
            }
           
            
            let response = APIResponse()

            //Complete API Response
            return response

        })
}

我的结论是在map中使用抛出来处理错误。

EN

回答 2

Stack Overflow用户

发布于 2016-04-12 15:48:00

您的解决方案是正确的,这就是为什么用throws注释RxSwift中的map操作符。Release notes of RxSwift 2明确表示:

增加了对SWIFT2.0错误处理try/do/catch的支持。

您现在可以只编写

代码语言:javascript
复制
API.fetchData(URL)
  .map { rawData in
      if invalidData(rawData) {
          throw myParsingError
      }

      ...

      return parsedData
  }

即使在` `RxCocoa

票数 2
EN

Stack Overflow用户

发布于 2016-04-12 01:11:57

使用RxSwift + Moya/RxSwift + Moya-ObjectMapper/RxSwift这组PODs可以很好地实现网络层

最后,您的模型代码将如下所示

代码语言:javascript
复制
import ObjectMapper

final class Product: Mappable {
    var id: String?
    var categoryId: String?
    var name: String?

    func mapping(map: Map) {
        id <- map["id"]
        categoryId <- map["category_id"]
        name <- map["name"]
    }
}

和服务

代码语言:javascript
复制
final class ProductService {

    class func productWithId(id: String, categoryId: String) -> Observable < Product > {
        return networkStubbedProvider
            .request(.Product(id, categoryId))
            .filterSuccessfulStatusAndRedirectCodes()
            .mapObject(Product)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36554154

复制
相关文章

相似问题

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