美文网首页
iOS 串行任务

iOS 串行任务

作者: 张科_Zack | 来源:发表于2021-02-01 16:13 被阅读0次

    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 {
                     // 任务结束
                }
    
            }
    
    

    实现过程如有疑问可以私信我。

    相关文章

      网友评论

          本文标题:iOS 串行任务

          本文链接:https://www.haomeiwen.com/subject/maajtltx.html