美文网首页
RxAlamofire 的 rx.json 与 Codable

RxAlamofire 的 rx.json 与 Codable

作者: 创业即流浪 | 来源:发表于2018-12-15 23:33 被阅读13次

    网上有很多基于rx.data 方法的,或者responseXXX的,不采用那些方法的原因是,那些方法不支持 statusCode 的错误判定,也就是说,如果statusCode 是404 这种错误的时候,onError 不会触发。但是 rx.json是可以触发的。为什么这么做,大家去看RxAlamofire的源代码,很好理解,不做赘述,此处只解决问题。

    extension ObservableType {
    
        public func mapObject<T: Codable>(type: T.Type) -> Observable<T> {
            return map { data -> T in
                guard let data = try? JSONSerialization.data(withJSONObject: data, options: .prettyPrinted) else {
                    throw NSError(
                            domain: "",
                            code: -1,
                            userInfo: [NSLocalizedDescriptionKey: "Could not decode object"]
                    )
                }
                return try JSONDecoder().decode(T.self, from: data)
            }
        }
    
        public func mapArray<T: Codable>(type: T.Type) -> Observable<[T]> {
            return map { data -> [T] in
                guard let data = try? JSONSerialization.data(withJSONObject: data, options: .prettyPrinted) else {
                    throw NSError(
                            domain: "",
                            code: -1,
                            userInfo: [NSLocalizedDescriptionKey: "Could not decode object"]
                    )
                }
                return try JSONDecoder().decode([T].self, from: data)
            }
        }
    }
    

    以下是使用方法举例:

        return SessionManager.default.rx.json(.put, "\(endpoint)customer/\(customerID)", parameters: customerBean.dictionary, encoding: JSONEncoding.default)
                .observeOn(MainScheduler.instance)
                .mapObject(type: CustomerBean.self)
    

    相关文章

      网友评论

          本文标题:RxAlamofire 的 rx.json 与 Codable

          本文链接:https://www.haomeiwen.com/subject/kubzhqtx.html