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来处理错误。
答案 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)
}
}