在RxSwift中实施tryMap-like功能的推荐方法是什么?
下面的代码是我如何将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
})
}我的结论是在map中使用抛出来处理错误。
发布于 2016-04-12 15:48:00
您的解决方案是正确的,这就是为什么用throws注释RxSwift中的map操作符。Release notes of RxSwift 2明确表示:
增加了对SWIFT2.0错误处理try/do/catch的支持。
您现在可以只编写
API.fetchData(URL)
.map { rawData in
if invalidData(rawData) {
throw myParsingError
}
...
return parsedData
}即使在` `RxCocoa
发布于 2016-04-12 01:11:57
使用RxSwift + Moya/RxSwift + Moya-ObjectMapper/RxSwift这组PODs可以很好地实现网络层
最后,您的模型代码将如下所示
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)
}
}https://stackoverflow.com/questions/36554154
复制相似问题