IOS多线程之NSOperation(2)

IOS多线程之NSOperation(2)

最大并发数

open var maxConcurrentOperationCount: Int

并发数就是同时执行的任务数。比如,同时开3个线程执行3个任务,并发数就是3。
但是,并发数是3,并不代表开启的线程数就是3,也有可能是4个或者5个。因为线程有可能在等待,进入了就绪状态。

执行的过程:

  1. 把操作添加到队列;
  2. 去线程池去取空闲的线程,如果没有就创建线程;
  3. 把操作交给线程池中取出的线程执行;
  4. 执行完成后,把线程再放回线程池中;
  5. 重复2,3,4直到所有的操作都执行完。

GCD的区别

GCD会自动重用线程,而 NSOperation 不会,会一直开线程。
而开太多线程反而会影响效率,我们需要自己控制
可以通过最大并发数控制

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 3
for _ in 0..<10{
    queue.addOperation {
        sleep(1)
        print("\(Thread.current)")
    }
}
/*
<NSThread: 0x6000001e0e80>{number = 4, name = (null)}
<NSThread: 0x6000001e2d80>{number = 7, name = (null)}
<NSThread: 0x6000001fc340>{number = 5, name = (null)}
<NSThread: 0x6000001f8cc0>{number = 8, name = (null)}
<NSThread: 0x6000001e0e80>{number = 4, name = (null)}
*/

//打印时是3个3个打印的

队列的操作

//暂停
func suspend(){
    queue.isSuspended = true
}
//继续
func resume(){
    queue.isSuspended = false
}
//取消
func cancel(){
    queue.cancelAllOperations()
}

Operation的状态

//取消
open var isCancelled: Bool { get }
//执行中
open var isExecuting: Bool { get }
//完成
open var isFinished: Bool { get }
//就绪
open var isReady: Bool { get }

控制Operation的状态

//启动
open func start()
//取消
open func cancel()

可以继承自定义MyOperation继承Operation类,重写startcancel方法来自己管理

let operation = MyOperation()
operation.start()
operation.cancel()

class MyOperation: Operation {
    override func start() {
        super.start()
        print("operation started")
    }

    override func main() {
        super.main()
        print("operation main")
    }

    override func cancel() {
        super.cancel()
        print("operation cancel")
    }
}

/*
operation main
operation started
operation cancel
*/
posted @ 2023-04-05 17:48  R1cardo  阅读(30)  评论(0编辑  收藏  举报