2.0.0

2.0.0

Bas van Kuijck 维护。



2.0.0

  • Bas van Kuijck

Bismuth

铋是 E-sites iOS Suite 的一部分。


一个处理队列的轻量级框架

forthebadge forthebadge

Platform CocoaPods Compatible Carthage compatible Travis-ci

安装

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()

队列的当前状态(idlepausedrunning

var state: Bismuth.QueueState