美文网首页
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

    Cocoa Operation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有O...

  • Swift 5.x 多线程

    Swift多线程编程方案: Thread Cocoa Operation (Operation 和 Operati...

  • iOS-Swift相关

    swift程序. 1.Swift多线程之Operation:异步加载CollectionView图片2.Swift...

  • iOS多线程浅谈-Thread

    iOS swift多线程主要包括Thread,GCD,Operation 1.Thread三种 方式1 方式2: ...

  • Swift- 多线程编程 Operation

    相关文章:NSOperation 项目Demo代码 一、NSOperation子类 NSOperation是一个抽...

  • Swift多线程之Operation(一)

    自定义Operation子类: 代码实现: 定义_executing,_finished的原因是因为它们只有对应的...

  • iOS多线程操作:NSOperation

    Operation也是我们常见的多线程操作方式之一,在许多知名框架的多线程操作都是使用的Operation这种操作...

  • swift多线程

    swift 2.0 和 3.0的多线程的区别 swift 2.0多线程的基础使用 dispatch_async(d...

  • 多线程-Operation

    多线程之Operation 本文参考 reywenderlich 的一篇文章和demo介绍自定义operation...

  • IOS多线程

    多线程技术 Thread 给线程加锁使线程同步 Operation

网友评论

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

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