IOS多线程之NSOperation(2)
IOS多线程之NSOperation(2)
最大并发数
open var maxConcurrentOperationCount: Int
并发数就是同时执行的任务数。比如,同时开3个线程执行3个任务,并发数就是3。
但是,并发数是3,并不代表开启的线程数就是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类,重写start和cancel方法来自己管理
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
*/