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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值