代碼簡(jiǎn)單 ? (解析數(shù)據(jù)使用ObjectMapper+SwiftyJSON)
首先寫個(gè)遵循自Moya的TargetType協(xié)議的枚舉
import Moya
import Result
import RxSwift
import ObjectMapper
import SwiftyJSON
import MBProgressHUD
fileprivate let lj_baseURL = "https://www.baidu.com"
enum LJApiManager {
????case Login([String: Any])
????case otherURL
}
extension LJApiManager: TargetType {
var baseURL: URL {
switch self {
case .Login:
return URL(string: lj_baseURL)!
default:
return URL(string: lj_baseURL)!
}
}
var path: String {
switch self {
case .Login:
return "login"
default:
return ""
}
}
var method: Moya.Method {
switch self {
case .Login:
return .post
default:
return .post
}
}
var sampleData: Data {
switch self {
case .Login:
return "".data(using: .utf8)!
default:
return "".data(using: .utf8)!
}
}
var task: Task {
switch self {
case .Login(let parameters):
return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
default:
return .requestPlain
}
}
var headers: [String : String]? {
return nil
}
}
可選:Moya的插件PluginType
public final class LJRequestPlugin: PluginType {?
// 請(qǐng)求開始
?public func willSend(_ request: RequestType, target: TargetType) { ? ? ? ? ? ? ? ? ? ? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = true
}
// 請(qǐng)求結(jié)束
?public func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
UIApplication.shared.isNetworkActivityIndicatorVisible = false
}
}
解析數(shù)據(jù)給Observable寫個(gè)擴(kuò)展
extension Observable {
?func mapObject<T: BaseMappable>(type: T.Type) -> Observable<T>{?
?return self.map({ response in?
?guard let dict = response as? [String: Any], let object = Mapper().map(JSON: dict) else { throw LJNetError.JSONError
?}?
?return object
?})
?}
?func mapArray<T: BaseMappable>(type: T.Type) -> Observable<[T]> {?
?return self.map { response in?
?let json = JSON(response)?
?guard let array = json["body"].arrayObject as? [[String: Any]] else {?
?throw LJNetError.JSONError?
?}
?return Mapper().mapArray(JSONArray: array)
}
}
}
enum LJNetError: String {
case JSONError = "JSON解析錯(cuò)誤"
case OtherError = "其他錯(cuò)誤"
}
extension LJNetError: Swift.Error {}
定義一個(gè)全局的MoyaProvider
let provider = MoyaProvider<LJApiManager>(plugins: [LJRequestPlugin()])
寫個(gè)基本請(qǐng)求類 (UserModel是一個(gè)用戶模型)
import Moya
import RxSwift
import ObjectMapper
final class LJBaseModel {?
?init() {
?}?
?static var share: LJBaseModel {
?struct Static {?
?static let instance: LJBaseModel = LJBaseModel()?
?}
?return Static.instance
?}
?func login(_ paras: [String: Any]) -> Observable<UserModel>{
return rx_provider.rx.request(.Login(paras)).filterSuccessfulStatusCodes().asObservable().mapJSON().mapObject(type: UserModel.self)
}
}
使用
LJBaseModel.share.login(["username": "admin", "password": "123456"]).subscribe(onNext: { userModel in
print(userModel.result.name)
}).disposed(by: disposeBag)