模型驱动的 API 客户端
IQAPIClient 允许我们发起 API 请求,并以您定义的模型对象形式返回响应。
库 | 语言 | 最低 iOS 目标 | 最低 Xcode 版本 |
---|---|---|---|
IQAPIClient | Swift | iOS 10.0 | Xcode 11 |
5.0 及以上
IQAPIClient 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'IQAPIClient'
或者,您可以根据 要求 中的 Swift 支持表选择您需要的版本
pod 'IQAPIClient', '1.0.0'
拖放 将演示项目中的 IQAPIClient
目录到您的项目中
Swift Package Manager (SPM) 是 Apple 的依赖管理工具。 现在 Xcode 11 中支持它。 因此,它可以用于所有 appleOS 类型的项目中。 它也可以与其他工具(如 CocoaPods 和 Carthage)一起使用。
要将 IQAPIClient 包安装到您的包中,请在 Package.swift
文件的 dependencies 部分添加对 IQAPIClient 的引用以及目标发布版本
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
products: [],
dependencies: [
.package(url: "https://github.com/hackiftekhar/IQAPIClient.git", from: "1.0.0")
]
)
通过 Xcode 安装 IQAPIClient 包
在使用 IQAPIClient 之前,我们需要进行一些初始配置,例如设置您的 API 基础 URL 和默认标头等。您可以在您的 AppDelegate 中执行此操作。
IQAPIClient.baseURL = URL(string: "https://www.example.com/api/v1")
IQAPIClient.httpHeaders["Content-Type"] = "application/json"
IQAPIClient.httpHeaders["Accept"] = "application/json"
现在假设您有一个 API 返回用户列表,并且您为此有一个 User 模型。
struct User {
let id: Int
let name: String
let email: String?
}
现在首先,我们需要修改我们的模型以使其与 IQAPIClient 兼容。 为此,我们只需要使用 Decodable 协议确认我们的 User 模型即可。
// Now it's ready to be used with IQAPIClient
struct User: Decodable {
let id: Int
let name: String
let email: String?
}
static func sendRequest<Success>(
path: String,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
completionHandler: @escaping
(_ result: Swift.Result<Success, Error>) -> Void)
其中原生 Swift.Result 看起来像这样
enum Result<Success, Failure> where Failure: Error {
case success(Success) /// A success, storing a `Success` value.
case failure(Failure) /// A failure, storing a `Failure` value.
}
static func sendRequest<Success, Failure>(
path: String,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
completionHandler: @escaping
(_ result: IQAPIClient.Result<Success, Failure>) -> Void)
其中 IQAPIClient.Result 看起来像这样
enum Result<Success, Failure> {
case success(Success) /// A success, storing a `Success` value.
case failure(Failure) /// A failure, storing a `Failure` value.
case error(Error) /// An error, storing an `Error` value.
}
要获取用户列表,您可以使用 IQAPIClient 的几种方法。
class ViewController: UIViewController {
private func getUsersList() {
//Result<[User], NSError> detects that the app is asking for array of User object
IQAPIClient.sendRequest(path: "/users") { [weak self] (result: Swift.Result<[User], NSError>) in
switch result {
case .success(let users):
self?.users = users
self?.refreshUI()
case .failure(let error):
//Show error alert
print(error.localizedDescription)
}
}
}
}
假设 APIMessage 看起来如下,并且当出现问题时,我们会收到这种响应
struct APIMessage: Decodable {
let status: Bool
let code: Int
let message: String
}
class ViewController: UIViewController {
private func getUsersList() {
//Result<[User], NSError> detects that the app is asking for array of User object
IQAPIClient.sendRequest(path: "/users") { [weak self] (result: Swift.Result<[User], APIMessage>) in
switch result {
case .success(let users): //[User] object
self?.users = users
self?.refreshUI()
case .failure(let message): //APIMessage object
//Show failure alert
print(message.code)
print(message.message)
case .error(let error): //Error object
//Show error alert
print(error.localizedDescription)
}
}
}
}
extension IQAPIClient {
@discardableResult
static func getUsersList(completionHandler: @escaping (_ result: Swift.Result<User, NSError>) -> Void) -> DataRequest {
return sendRequest(path: "/users", completionHandler: completionHandler)
}
}
extension IQAPIClient {
@discardableResult
static func getUsersList(completionHandler: @escaping (_ result: Swift.Result<[[String:Any]], NSError>) -> Void) -> DataRequest {
return sendRequest(path: "/users", completionHandler: completionHandler)
}
}
class ViewController: UIViewController {
private func getUsersList() {
//Now use the getUsersList function
IQAPIClient.getUsersList { [weak self] result in
switch result {
case .success(let users):
self?.users = users
self?.refreshUI()
case .failure(let error):
//Show error alert
print(error.localizedDescription)
}
}
}
}
- successSound: Bool = false //A success sound/vibration will be played on success response, you could use it when you create some records like saving something in the server.
- failedSound: Bool = false //An error sound/vibration will be played on error
- executeErroHandlerOnError: Bool = true //This will also execute common error handler block on error to handle all error from a single place.
//TODO 添加示例
根据 MIT 许可证分发。
非常欢迎任何贡献! 您可以通过 GitHub 上的 pull request 和 issue 进行贡献。
如果您想联系我,请给我发送电子邮件:hack.iftekhar@gmail.com