Queuer
Queue (https://github.com/FabrizioBrancati/Queuer) 第三方库对 Operation 的封装,使用起来比较方便。
这里用串行执行网络请求作为一个事例。
基本实现
- 第一步 声明一个类 NetWorkOperation 继承自 ConcurrentOperation
class NetWorkOperation: ConcurrentOperation {
var dataTask:URLSessionDataTask?
override func start() {
if isCancelled {
self.finish()
}
dataTask?.resume()
}
}
- 第二步 创建一个操作队列对象 countryOperationQueue,并设置队列最大并发数为 1
@objc let countryOperationQueue = OperationQueue()
countryOperationQueue.maxConcurrentOperationCount = 1;
- 第三部步 实例化 ConcurrentOperation 的两个对象。并添加到第二步声明的队列当中
var urlRequest = URLRequest(url:"https://www.baidu.com")
let networkOperation = NetWorkOperation()
let dataTask = URLSession.shared.dataTask(with: urlRequest) { data, response, _ in
networkOperation.finish()
}
networkOperation. dataTask = dataTask
networkOperation.addOperation(networkOperation)
var urlRequest1 = URLRequest(url:"https://www.jianshu.com")
let networkOperation1 = NetWorkOperation()
let dataTask1 = URLSession.shared.dataTask(with: urlRequest1) { data, response, _ in
networkOperation.finish()
}
networkOperation. dataTask = dataTask1
networkOperation.addOperation(networkOperation1)
这样就可以初步实现串行任务了。
Operation 任务结束的监听
使用 KVO 实现 Operation 监听,主要是对 OperationQueue 属性的监听。
var obseration: NSKeyValueObservation?
obseration = observe(\.countryOperationQueue.operations, options: [.new]) { (object, change) in
// 2. Migrate Languages
if change.newValue?.count == 0 {
// 任务结束
}
}
实现过程如有疑问可以私信我。
网友评论