yangKJ / RxNetworks

🧚 MVP Network Api library. 插件版网络基础架构,支持响应式。
MIT License
225 stars 50 forks source link

想问下 如果向支持codeable 怎么操作哦 #22

Closed Delevel1020 closed 4 months ago

cdoky commented 4 months ago
public struct ApiResponse<T: Codable>: Codable {
    public var code: Int
    public var message: String?
    public var data: T?

    public var isSuccess: Bool {
        return 200 ..< 300 ~= code
    }

    public init(code: Int = -100010, message: String? = nil, data: T? = nil) {
        self.code = code
        self.message = message
        self.data = data
    }

    public static func onErrorRecover(_ err: Swift.Error)-> SharedSequence<DriverSharingStrategy, ApiResponse<T>> {
        let __err = err as NSError
        return Driver<ApiResponse<T>>.just(ApiResponse<T>(code: __err.code, message: __err.localizedDescription))
    }
}

public extension Observable where Element: Any {
    @discardableResult
    func decode<T: Codable>(_ type: T.Type) -> Observable<T> {
        return self.map { element -> T in
            let decoder = JSONDecoder()
            // 反序列化日期, 根据业务情况, 自行修改
            decoder.dateDecodingStrategy = .iso8601
            // 或者自定义, 参考`DateDecodingStrategy`
            // let formatter = DateFormatter()
            // formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
            // decoder.dateDecodingStrategy = .custom({ decoder-> Date in
            //     let container = try decoder.singleValueContainer()
            //     let dateStr = try container.decode(String.self)
            //
            //     let date = formatter.date(from: dateStr)
            //     return date!
            // })
            let data = try JSONSerialization.data(withJSONObject: element)
            let result = try decoder.decode(T.self, from: data)
            return result
        }
    }
}

用法

Api.detail
    .request(plugins: [
        NetworkLoadingPlugin()
    ])
    .decode(ApiResponse<YOURMODEL>.self)

扩展

/// https://github.com/Flight-School/AnyCodable
public typealias ApiRespAny = ApiResponse<AnyCodable>

public extension ApiRespAny {
    var dict: [String: Any]? {
        return self.result as? [String: Any]
    }

    var result: Any? {
        return self.data?.value
    }
}

用法

Api.detail
    .request(plugins: [
        NetworkLoadingPlugin()
    ])
    .decode(ApiRespAny.self)
Delevel1020 commented 3 months ago

好的 谢谢了

yangKJ commented 3 months ago

最近又新写了一个关于Codable的库HollowCodable可以参考使用! 回头我看看兼容问题,写一个关于Codable的插件供大家使用。