首页 > 其他分享 >IOS多线程之NSOperation(1)

IOS多线程之NSOperation(1)

时间:2023-04-05 14:22:06浏览次数:62  
标签:队列 IOS NSOperationQueue NSOperation 线程 操作 多线程 block

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
 }

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

标签:队列,IOS,NSOperationQueue,NSOperation,线程,操作,多线程,block
From: https://www.cnblogs.com/r1cardo/p/17289378.html

相关文章

  • iOS - 利用 UIBezierPath 绘制圆弧
    iOS-利用UIBezierPath绘制圆弧APIUIBezierPath绘制圆弧主要利用以下方法:openfuncaddArc(withCentercenter:CGPoint,radius:CGFloat,startAngle:CGFloat,endAngle:CGFloat,clockwise:Bool)方法中各参数含义:center:圆心radius:半径startAngle:开始弧度endAn......
  • IOS实现水波纹
    IOS实现水波纹需要实现一个水波纹效果其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动具体实现定义两个layer,用不同的颜色填充lazyvarfrontLayer:CAShapeLayer={lettempV=CAShap......
  • IOS颜色选择器
    IOS颜色选择器UIColorWellUIColorWell是一个继承UIControl的视图,它不能调整大小和UISwitch类似,大小大约是44*44。点击可弹出一个选择颜色的弹窗因为是继承UIControl所以可以添加UIControlEventValueChanged类型的Event事件去监听颜色改变///Setstheselectedcoloron......
  • 黑马程序员高端iOS培训:苹果一条公告搅混了大家的脑洞
         正文前面,先说点正经的。苹果公司在北京时间8月30日凌晨正式向媒体发出邀请函,宣布将于北京时间9月8日凌晨1点在旧金山的比尔-格雷厄姆市政礼堂举行苹果秋季新品发布会。此次邀请函的主题为“Seeyouonthe7th”。     正经的说完了,不正经的要开始说了。或许是天......
  • HDOJ1017 A Mathematical Curiosity
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1017这个题目其实挺坑的。首先是N,应该挺多人纠结过这个N,N其实是blocks(块),一块有未知个cases。一个块的结束标志是0,0。然后是PE的问题,空格、空行,我也是被坑的好惨。这里应该是每个块之间有一个空行!也就是说,最后一个块是不......
  • IOS获取蓝牙状态
    IOS获取蓝牙状态监听蓝牙状态在LinkBinariesWithLibraries中添加CoreBluetooto.framework创建CBCentralManager对象为了避免每次都获取蓝牙状态都弹窗,配置一下options将CBCentralManagerOptionShowPowerAlertKey设置为falseletoptions=[CBCentralManagerOptionShowPo......
  • 多线程任务怎么选 Thread,ThreadPoll,Task
    提问多线程任务怎么选Thread,ThreadPoll,Task回答Task原因Thread:创建销毁代价昂贵ThreadPoll:管理线程资源Task基于线程池......
  • Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
    如何阻止JavaSpringBootTest单元测试中包括多线程时,没跑完就结束了使用CountDownLatchCountDownLatch、CyclicBarrier使用区别多线程ThreadPoolTaskExecutor应用JavaBasePooledObjectFactory对象池化技术@SpringBootTestpublicclassPoolTest{@Test......
  • 多线程3
    Lock锁ReentrantLocklock=newReentrantLock();classTestLock2implementsRunnable{  int ticketName=10;  //定义lock锁  privatefinalReentrantLocklock=newReentrantLock();  @Override  publicvoidrun(){​    while(true){  ......
  • 多线程1
    Thread   //继承Thread类,重写run方法,调用start开启线程//注意:线程开启不一定立即执行,由CPU调度执行publicclassDemo01extendsThread{//  publicvoidrun(){    for(inti=0;i<20;i++){      System.out.println("我在看代码==>"+i);......