swift 多线程,CocoaOperation,Operation + OperationQueue

 两个都是面向对象的

取消,依赖,优先级处理,复杂逻辑,保存业务状态,子类化

Operation分为两类

  • Operation

相当于父类

  • BlockOperation

继承父类 可以用传递闭包进行操作

Opreation

分别有四种状态

  1. isReady
  2. isExecuting
  3. isFinished
  4. isCancelled

运行状态有两种

  • sync 同步 

需要实现main()方法

  • async 异步 (网络操作)

 start() 开启线程方法

isAsynchronous  是否异步

isExecuting 是否执行中

isFinished  是否结束

可以添加或者删除依赖 

addDependency(Operation)

reoveDependency(Operation)

denpendencies:[Operation] 

也就是另外的一个Operation执行完毕后才能执行当前的operation

OpreationQueue

  1. OperationQueue队列里可以加入很多个Operation,可以把OperationQueue看做一个线程池,可往线程池中添加操作(Operation)到队列中
  2. 底层使用GCD
  3. maxConcurremtOperationCount可以设置最大并发数
  4. defalutMaxConturrenOperationCount 根据当前系统条件确定的最大并发数
  5. 可以取消所有Operation,但是当前正在执行的不会取消。
  6. 所有Operation执行完毕后退出销毁

BlockOperation

code

//: FROM  https://www.anuomob.com

import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
    func threadTest(){
        let operation = BlockOperation(block: {[weak self] in
            self?.threadWorker()
            return
            
        })
        let queue=OperationQueue()
        queue.addOperation(operation)
        print("threadTest")
    }
    
    @objc func threadWorker(){
        print("threadWorker")
    }
}

let obj = ObjectForThread()
obj.threadTest()

继承Operation

//: FROM  https://www.anuomob.com

import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
    func threadTest(){
        let operation = MyOperation()
        let queue = OperationQueue()
        queue.addOperation(operation)
        print("threadTest")
    }
        
      
}

class MyOperation:Operation{
    override func main() {
        sleep(1)
        print("MyOperation")
    }
    
}
let obj = ObjectForThread()
obj.threadTest()

Opeartion 完成的回调

completionBlock

//: FROM  https://www.anuomob.com

import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
    func threadTest(){
        let operation = MyOperation()
        operation.completionBlock = {()-> Void in
            print("--operation.completionBlock--")
        }
        let queue = OperationQueue()
        queue.addOperation(operation)
        print("threadTest")

    }
        
      
}

class MyOperation:Operation{
    override func main() {
        sleep(1)
        print("MyOperation")
    }
    
}
let obj = ObjectForThread()
obj.threadTest()

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/108317759