2

RxSwift 中推荐的实现类 RACtryMap功能的方法是什么?

以下代码是我如何将 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 来处理错误。

4

2 回答 2

2

您的解决方案是正确的,这就是为什么mapRxSwift 中的运算符使用throws. RxSwift 2 的发行说明明确指出:

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

你现在可以写

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

      ...

      return parsedData
  }

即使在`RxCocoa

于 2016-04-12T07:48:00.373 回答
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)
    }
}
于 2016-04-11T17:11:57.187 回答