铋是 E-sites iOS Suite 的一部分。
一个处理队列的轻量级框架
安装
Podfile
pod 'Bismuth'
然后
pod install
实现
import Bismuth
import Alamofire
extension Alamofire.HTTPMethod: Codable { }
struct RequestQueueItem: BismuthQueueable {
private enum CodingKeys: String, CodingKey {
case url
case httpMethod
case parameters
}
private let uuid = UUID().uuidString
let url: String
let httpMethod: HTTPMethod
let parameters: [String: String]?
init(url: String, httpMethod: HTTPMethod = .get, parameters: [String: String]? = nil) {
self.url = url
self.httpMethod = httpMethod
self.parameters = parameters
}
static func == (lhs: RequestQueueItem, rhs: RequestQueueItem) -> Bool {
return lhs.uuid == rhs.uuid
}
}
func configure() {
var config = Bismuth.Config(identifier: "api-requests")
config.logProxy = { line in
print("[REQ] \(line)")
}
config.autoStart = false // Default: true
config.canRunInBackground = false // Default: true
config.retryTime = 30 // Default: 15
queue = Bismuth.Queue<RequestQueueItem>(config: config)
queue.delegate = self
queue.add(RequestQueueItem(url: "https://domain.com/api/get"))
queue.add(RequestQueueItem(url: "https://domain.com/api/post", httpMethod: .post, parameters: [ "name": "Bas" ]))
queue.add(RequestQueueItem(url: "https://domain.com/api/items/3", httpMethod: .delete))
}
// BismuthQueueDelegate functions
func queue<T>(_ queue: Bismuth.Queue<T>, handle item: T, attempts: Int, completion: @escaping (Bismuth.HandleResult) -> Void) where T : BismuthQueueable {
guard let item = item as? RequestQueueItem else {
completion(.handled)
return
}
// Do stuff with the queue item
Alamofire.request(item.url, method: item.httpMethod, parameters: item.parameters)
.validate()
.responseJSON { response in
switch response.result {
case .success:
completion(.handled)
case .failure(let error):
if attempts >= 5 {
completion(.handled)
} else {
completion(.retry)
}
}
}
}
func queueFinished<T>(_ queue: Bismuth.Queue<T>) where T : BismuthQueueable {
}
配置
键 | 类型 | 描述 | 默认 |
---|---|---|---|
autoStart |
Bool |
您想要队列在应用激活时自动启动吗? | true |
reryTimeInterval |
TimeInterval |
失败的队列项将在x秒后重试 | 15 |
canRunInBackground |
Bool |
队列是否可以在后台操作 | true |
logProxy |
(String) -> Void |
一个闭包,用于调试日志调用 | nil |
控制
暂停队列直到调用
resume()
func pause()
使用
pause()
暂停的队列将继续执行
func resume()
启动空闲的队列
func start()
队列的当前状态(
idle
,paused
或running
)
var state: Bismuth.QueueState