Moya-ModelMapper
ModelMapper 的用于 Moya 的绑定,以方便使用 RxSwift 和 ReactiveCocoa 进行 JSON 序列化。
安装
CocoaPods
pod 'Moya-ModelMapper', '~> 10.0'
如果您想使用 RxSwift 的绑定,请使用相应的 subspec。
pod 'Moya-ModelMapper/RxSwift', '~> 10.0'
如果您想使用 ReactiveSwift 的绑定,请使用相应的 subspec。
pod 'Moya-ModelMapper/ReactiveSwift', '~> 10.0'
Carthage
在 Cartfile 中指定
github "sunshinejr/Moya-ModelMapper" ~> 10.0
Carthage 用户可以指向此仓库,并使用生成的任何框架,例如 Moya-ModelMapper、RxMoya-ModelMapper 或 ReactiveMoya-ModelMapper。
Swift 包管理器
将以下内容添加为 Package.swift
依赖项。
.package(url: "https://github.com/sunshinejr/Moya-ModelMapper.git", .upToNextMajor(from: "10.0.0"))
绑定可通过 Moya_ModelMapper
模块使用。如果您对反应式扩展感兴趣,请使用 ReactiveMoya_ModelMapper
或 RxMoya_ModelMapper
。
使用方法
创建一个实现协议 Mappable 的模型结构体或类。
import Foundation
import Mapper
struct Repository: Mappable {
let identifier: Int
let language: String? // Optional property
let url: String? // Optional property
init(map: Mapper) throws {
try identifier = map.from("id")
language = map.optionalFrom("language")
url = map.optionalFrom("url")
}
}
然后你将拥有扩展 Moya 响应的方法。这些方法是
map(to:)
map(to:keyPath:)
compactMap(to:)
compactMap(to:keyPath)
当使用 map(to:)
尝试将整个响应数据映射到对象/数组时,使用 map(to:keyPath:)
可以指定响应中的嵌套对象以获取。例如 map(to: User.self, keyPath: "data.response.user")
将遍历数据字典,然后通过响应字典到用户字典,将其解析。compactMap
是数组 map
的一个变体,如果其中一个对象失败,它不会使整个操作失败,只会从数组中移除该对象。RxSwift
和 ReactiveCocoa
扩展也都有所有这些方法,但 RxSwift
还有可选映射。请参阅下面的示例或 Demo 项目。
1. 正常使用(无 RxSwift 或 ReactiveCocoa)
provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.request(GitHub.repos("mjacko")) { (result) in
if case .success(let response) = result {
do {
let repos = try response.map(to: [Repository].self)
print(repos)
} catch Error.jsonMapping(let error) {
print(try? error.mapString())
} catch {
print(":(")
}
}
}
2. RxSwift
provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.rx.request(GitHub.repo("Moya/Moya"))
.map(to: User.self, keyPath: "owner")
.subscribe { event in
switch event {
case .success(let user):
print(user)
case .error(let error):
print(error)
}
}
此外,包含 RxSwift
的模块包含可选映射。这意味着如果映射失败,映射器不会抛出错误,而是返回 nil。例如
provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.rx.request(GitHub.repos("mjacko"))
.mapOptional(to: [Repository].self)
.subscribe { event in
switch event {
case .success(let repos):
// Here we can have either nil or [Repository] object.
print(repos)
case .error(let error):
print(error)
}
}
3. ReactiveSwift
provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.reactive.request(GitHub.repos("mjacko"))
.map(to: [Repository].self)
.observeOn(UIScheduler())
.start { event in
switch event {
case .value(let repos):
print(repos)
case .failed(let error):
print(error)
default: break
}
}
作者
Sunshinejr, [email protected], @thesunshinejr
许可协议
Moya-ModelMapper采用MIT许可协议。更多信息请参阅LICENSE文件。