WhiteFlowerFactory 是一个简单的 URLSession 包装器,支持同时和串行请求队列。
Cocoapods 安装
pod 'WhiteFlowerFactory'
Carthage 安装(推荐)
将以下内容添加到 cartfile
github "JoeyBodnar/WhiteFlowerFactory" == 0.4.0
使用方法
目前,所有回调都在主队列中完成,但这种情况可能会在未来发生变化。
GET 请求
要进行简单的 GET 请求
WhiteFlower.shared.get(urlString: "") { response in
switch response.result {
case .success(let data): // do something with data
case .failure(let error): // do something with network error
}
}
使用 Codable 序列化响应
如果您有一个类型,希望使用 Codable 序列化响应
WhiteFlower.shared.get(urlString: "") { response in
switch response.serializeTo(type: MyClass.self) {
case .success(let myClassInstance): // do something with myClassInstance
case .failure(let error): // do something with network error
}
}
验证是否正常
有时你只是想确认一个对象已被创建,并期望得到一个空体的响应。为此,请使用isOK()
WhiteFlower.shared.post(urlString: "https://#/postSomething", params: ["key": "value"], headers: nil, completion: { (response) in
switch response.isOk() {
case .success: // success
case .failure(let error)
}
}
POST 请求
一个示例 POST 请求
WhiteFlower.shared.post(urlString: "urlHere", params: ["testParam" : "param1"], headers: [HTTPHeader(field: HTTPHeaderField.authentication.rawValue, value: "Bearer xxxx")]) { (response) in
}
提供商 - 类型安全的路由
要使用 WhiteFlowerFactory 提供类型安全的路由,建议你创建一个符合 Provider
协议的枚举。理想情况下,你将为应用程序中每个 baseURL
端点创建一个符合 Provider
协议的枚举。例如,假设你的应用程序需要连接到 Stripe API 和 Facebook API。你可以创建一个符合 Provider
协议的枚举,如下所示:
enum Facebook: Provider {
case login
case getFriends
var path: String {
switch self {
case .login: return "\(baseURL)/login"
case .getFriends: return "\(baseURL)/me/friends"
}
}
var baseURL: String { return "https://facebook.com" }
static var name: String { return String(describing: Facebook.self) // this returns "Facebook" }
}
Stripe 的也可以同样处理
enum Stripe: Provider {
case chargeCard
var path: String {
switch self {
case .chargeCard: return "\(baseURL)/charge"
}
}
var baseURL: String { return "https://api.stripe.com" }
static var name: String { return String(describing: Stripe.self) }
}
现在,你可以利用类型安全的路由了
WhiteFlower.shared.post(endPoint: Stripe.chargeCard, params: ["":""], headers: []) { (response) in
}
串行网络操作
要串行(一个接一个,在前一个请求完成后启动下一个请求)发起请求数据,只需创建一个 WhiteFlowerRequest
对象数组,并创建一个 WhiteFlowerSerialQueue
let requests = [WhiteFlowerRequest(method: .get, urlString: "https://facebook.com"), WhiteFlowerRequest(method: .get, urlString: "https://google.com"), WhiteFlowerRequest(method: .get, urlString: "https://reddit.com/r/iosprogramming")]
let queue = WhiteFlowerSerialQueue(operationQueue: OperationQueue())
queue.start(requests: requests, operationCompletion: { (response) in
// this completion is called after every indiviudal request is finished
// so in this examlple, it will be called 3 times
}) { (allResponses) in
// this is called at the very end and gives an array of APIResponse objects
}
并发网络操作
若要并发发起多个请求,且只在一个所有请求完成后接收回调,请使用 WhiteFlowerConcurrentQueue
类
let requests = [WhiteFlowerRequest(method: .get, urlString: "https://facebook.com"), WhiteFlowerRequest(method: .get, urlString: "https://google.com"), WhiteFlowerRequest(method: .get, urlString: "https://reddit.com/r/iosprogramming")]
let queue = WhiteFlowerConcurrentQueue(requests: [], queue: DispatchQueue.main)
queue.execute { responses in
// `responses` is an array of APIResponse objects
}
《responses》数组将按照响应原本执行的顺序返回响应。因此,在上面的示例中,对《https://facebook.com》的请求的响应对象将是第一个,google将是第二个,而reddit.com/r/iosprogramming将是最后一个。