IOS多线程之NSOperation(1)

IOS多线程之NSOperation(1)

  • NSOperation 是 OC 语言中基于 GCD 的面向对象的封装;
  • 提供了一些用 GCD 不好实现的功能;
  • 线程的生命周期由系统自动管理。
  1. NSOperation 需要和 NSOperationQueue 配合使用来实现多线程方案。单独使用 NSOperation 的话, 它是属于同步操作, 并不具备开启新线程的能力。
  • NSOperation:操作
    • NSOperation 类是一个抽象类,不能直接使用它来封装任务,而是使用系统定义的子类( NSInvocationOperation 或 NSBlockOperation)或者自定义子类来封装任务。
    • 操作对象是一个单发对象,即它只执行一次任务,不能再次执行。通常通过将操作添加到操作队列来执行操作。
  • NSOperationQueue:队列
    • 获取主队列:OperationQueue.main
    • 获取当前队列:OperationQueue.current
  1. 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)

xqw4thona7

如果不想使用 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
 }

简单介绍一下,下次继续分享

posted @ 2023-04-05 14:19  R1cardo  阅读(34)  评论(0编辑  收藏  举报