美文网首页
Swift - 多线程 Operation和OperationQ

Swift - 多线程 Operation和OperationQ

作者: 小驴拉磨 | 来源:发表于2020-07-16 10:49 被阅读0次

    Cocoa Operation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有Operation和OperationQueue。其中Operation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子类:BlockOperation。创建Operation子类的对象,把对象添加到OperationQueue队列里执行。

    一、使用Operation的两种方式

    (1)直接用定义好的子类:BlockOperation

    import UIKit
    
    class ViewController: UIViewController {
    
        
        override func viewDidLoad() {
            super.viewDidLoad()
             
            let operation = BlockOperation(block: { [weak self] in
                self?.downloadImage()
                return
                })
             
            //创建一个NSOperationQueue实例并添加operation
            let queue = OperationQueue()
            queue.addOperation(operation)
            print(queue.operationCount)
        }
         
        //定义一个下载图片的方法,线程调用
        func downloadImage(){
            let imageUrl = "http://hangge.com/blog/images/logo.png"
            let data = try! Data(contentsOf: URL(string: imageUrl)!)
            print(data.count)
    
        }
    }
    

    (2)继承Operation
    然后把Operation子类的对象放入OperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成,然后它被队列释放。

    import UIKit
     
    class ViewController: UIViewController {
         
        override func viewDidLoad()
        {
            super.viewDidLoad()
             
            //创建线程对象
            let downloadImageOperation = DownloadImageOperation()
             
            //创建一个OperationQueue实例并添加operation
            let queue = OperationQueue()
            queue.addOperation(downloadImageOperation)
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
     
    class DownloadImageOperation: Operation
    {
        override func main(){
            let imageUrl = "http://hangge.com/blog/images/logo.png"
            let data = try! Data(contentsOf: URL(string: imageUrl)!)
            print(data.count)
        }
    }
    

    二、设置运行队列并发数

    OperationQueue队列里可以加入很多个Operation,可以把OperationQueue看做一个线程池,可往线程池中添加操作(Operation)到队列中。
    可以设置线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样可以同时运行队列中的全部操作。

    //设置并发数
    queue.maxConcurrentOperationCount = 5
    

    三、取消队列所有操作

    //取消所有线程操作
    queue.cancelAllOperations()
    

    四、每个Operation完成都会有一个回调表示任务结束

    //给operation设置回调
    operation.completionBlock = { () -> Void in
        print("--- operation.completionBlock ---")
    }
    

    原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_744.html

    相关文章

      网友评论

          本文标题:Swift - 多线程 Operation和OperationQ

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