IOS多线程之NSOperation(1)
- NSOperation 是 OC 语言中基于 GCD 的面向对象的封装;
- 提供了一些用 GCD 不好实现的功能;
- 线程的生命周期由系统自动管理。
- NSOperation 需要和 NSOperationQueue 配合使用来实现多线程方案。单独使用 NSOperation 的话, 它是属于同步操作, 并不具备开启新线程的能力。
- NSOperation:操作
- NSOperation 类是一个抽象类,不能直接使用它来封装任务,而是使用系统定义的子类( NSInvocationOperation 或 NSBlockOperation)或者自定义子类来封装任务。
- 操作对象是一个单发对象,即它只执行一次任务,不能再次执行。通常通过将操作添加到操作队列来执行操作。
- NSOperationQueue:队列
- 获取主队列:OperationQueue.main
- 获取当前队列:OperationQueue.current
- NSOperation 和 NSOperationQueue 实现多线程的步骤:
- 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中;
- 创建队列:创建一个 NSOperationQueue 对象;
- 添加操作到队列中:然后将 NSOperation 对象添加到 NSOperationQueue 队列中。系统会自动将 NSOperationQueue 中的 NSOperation 取出来,将取出的 NSOperation 封装的操作放到一条新线程上执行。
open func addOperation(_ op: Operation)
@available(iOS 4.0, *)
open func addOperations(_ ops: [Operation], waitUntilFinished wait: Bool)
@available(iOS 4.0, *)
open func addOperation(_ block: @escaping () -> Void)
如果不想使用 NSOperationQueue,可以通过调用 NSOperation 对象的start方法来自己执行操作。默认情况下,调用 NSOperation 的 start 方法并不会开一条新线程去执行操作,而是在当前线程同步执行操作。
使用
NSInvocationOperation在swift中不可用
使用BlockOperation
let operation = BlockOperation(block: block)
operation.start()
默认情况下,调用 NSOperation 的 start 方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。
只有将 NSOperation 放到一个 NSOperationQueue 中,才会异步执行操作。
internal func addOperation(block: @escaping ()->Void) {
let operation = BlockOperation(block: block)
let queue = OperationQueue()
queue.addOperation(operation)
}
注意点:如果将操作添加到队列后,又调用 start 方法,会导致Crash。
想要更新UI必须回到主线程
OperationQueue.main.addOperation { [weak self] in
guard let `self` = self else { return }
//更新UI
}
简单介绍一下,下次继续分享
标签:队列,IOS,NSOperationQueue,NSOperation,线程,操作,多线程,block From: https://www.cnblogs.com/r1cardo/p/17289378.html