Rx在tryx中替代RxSwift

时间:2016-04-11 16:22:23

标签: ios swift reactive-cocoa rx-swift

RxSwift中推荐使用RAC tryMap的功能是什么?

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

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解决方案。打开以获得更好的解决方案。

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

        })
}

我的结论是在地图中使用throw来处理错误。

2 个答案:

答案 0 :(得分:2)

您的解决方案是正确的,这就是为什么RxSwift中的map运算符使用throws进行注释的原因。 Release notes of RxSwift 2明确说明了这一点:

  

添加对Swift 2.0错误处理try / do / catch的支持。

     

你现在可以写

API.fetchData(URL)
  .map { rawData in
      if invalidData(rawData) {
          throw myParsingError
      }

      ...

      return parsedData
  }

即使在`RxCocoa

答案 1 :(得分:0)

使用这些POD集实现网络层有很好的方法 RxSwift + Moya/RxSwift + Moya-ObjectMapper/RxSwift

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

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"]
    }
}

服务

final class ProductService {

    class func productWithId(id: String, categoryId: String) -> Observable < Product > {
        return networkStubbedProvider
            .request(.Product(id, categoryId))
            .filterSuccessfulStatusAndRedirectCodes()
            .mapObject(Product)
    }
}