NSOperation

1. NSOperation类是一个抽象类,用来封装单任务的代码和数据。不能直接使用该类,可以使用系统定义的子类(NSInvocationOperation,NSBlockOperation)来完成任务,也可以自定义。需要将NSOperation的子类对象添加到队列中,用NSOperationQueue来实现,

2.NSOperation子类的创建方式

(1)NSInvocationOperatin创建

NSInvocationOperation *operation = [NSInvocationOperation alloc]initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];

(2)NSBlockOperation创建

NSBlockOperation *operation  = [NSBlockOperation blockOperationWithBlock:^{

<#code#>

}];

(3)子类化创建

①  创建NSOperation的类

②  覆写main方法

③  初始化子类

3. 队列的创建

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

4. 添加任务到任务队列

(1)[queue addOperation:<#(nonnull NSOperation *)#>];  //添加单个任务

(2)[queue addOperations:<#(nonnull NSArray<NSOperation *> *)#> waitUntilFinished:<#(BOOL)#>]; //添加多个任务,并且设置是否等待任务完成

(3)[queue addOperationWithBlock:^{

<#code#>

}];  //隐式添加

5.设置依赖需在添加到队列之前,添加依赖成功的前提是必须添加到队列中

[operation addDependency:<#(nonnull NSOperation *)#>];  operation与添加的队列是同步的,需等待添加的队列执行完后再执行operation

6. 设置队列的优先级

[operation setQueuePriority:<#(NSOperationQueuePriority)#>];

队列的级别设置

NSOperationQueuePriorityVeryLow

NSOperationQueuePriorityLow

NSOperationQueuePriorityNormal

NSOperationQueuePriorityHigh

NSOperationQueuePriorityVeryHigh

7.设置最大并发数

[queue setMaxConcurrentOperationCount:<#(NSInteger)#>];

8.取消任务 (正在执行的任务无法取消)

[operation cancel]; //取消单个任务

[queue cancelAllOperations]; //取消全部任务

9. 阻塞线程

[operation waitUntilFinished];

10.暂停和重启任务

[queue setSuspended:YES];   //暂停任务

[queue setSuspended:NO];  //重启任务

时间: 2024-08-06 05:42:05

NSOperation的相关文章

多线程之-NSOperation

多线程之-NSOperation NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 NSInvocationOperation 如果直接执行NSInvocationOperation中的操作, 那么默认会在主线程中执行 // 创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 创建操作 NSInvocationOperation *operation = [[NSInvocationOpe

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

iOS开发NSOperation 三:操作依赖和监听以及线程间通信

一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation ViewController /** * 1:NSOperation的使用:1:先创建队列NSOperationQueue:若不创建队列直接封装任务则默认在当前线程中串行执行任务,其队列分为两种主队列和非主队列,主队列和GCD中的主队列一样[NSOperationQueue mainQueue],而alloc in

线程2 NSOperation 抽像类的使用

// // ZYOperationViewController.h // Thread // // Created by yejiong on 14 // // ZYOperation.h // Thread // // Created by yejiong on 14/11/4. // Copyright © 2014年 zzz. All rights reserved. // #import <Foundation/Foundation.h> @interface ZYOperation

iOS中用GCD和NSOperation多个异步操作的关联

在iOS实际开发中,我们可能会遇到下面的场景:有以下四个操作A,B,C,D.要求A,B,C在子线程中执行,当A,B,C执行完毕之后回到主线程执行操作D,ABC之间可能会有相互依赖的关系,我们可以通过GCD和NSOperation都可以实现这样的需求. 1.GCD // 用GCD - (void)useGCD { // 1.1可以创建一个全局并发队列,A,B,C操作会在子线程中并发执行,ABC不存在先后执行顺序 // dispatch_queue_t quque=dispatch_get_glob

GCD和NSOperation 的概念,用法及之间的区别

CGD与NSOperation的区别 gcd是基于c的底层api,NSOperation属于object-c类.相对于gcd:1,NSOperation拥有更多的函数可用,具体查看api.2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系.3,有kvo,可以监测operation是否正在执行(isExecuted).是否结束(isFinished),是否取消(isCanceld).4,NSOperationQueue可以方便的管理并发.NSOperatio

step 7 NSOperation(高级/GCD对比)

高级演练 全局队列 /// 全局操作队列,统一管理所有的异步操作 @property (nonatomic, strong) NSOperationQueue *queue; - (NSOperationQueue *)queue { if (_queue == nil) { _queue = [[NSOperationQueue alloc] init]; } return _queue; } 最大并发操作数 /// MARK: - 最大并发操作数 - (void)opDemo1 { // 设

iOS开发-NSOperation与GCD区别

Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop,线程(包括Cocoa和POSIX)和Operation.GCD拥有非常轻量级的工作单元和并发方式,并且由系统决定其最佳调度方式.这个时候出现了一个问题,NSOperation如何处理呢? 其实我们在通过NSOperation和GCD进行开发过程中,会发现两者执行的方式有许多相似之处,NSOperat

多线程----NSOperation

NSOperation是Cocoa中的一个抽象类,用来封装单个任务和代码执行一项操作,由于是抽象类,所以不能直接实例化使用,必须定义子类继承该抽象类来实现, 使用NSOperation的方式有两种: 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation,有相关的使用方法. NSOperation的子类NSInvocationOperation提供了一套简单的多线程编程方法,是IOS多线程编程中最简单的一种实现方式. 另一种是继承NSOper

NSOperation开启线程情况分析

如果NSOperation中只有一个任务,且调用start方法不会开启线程,start默认在当前线程执行. 如果NSOperation中只有一个任务,添加到队列当中会开启线程,如果是主队列则不会开启新的线程 一个NSOperation中添加了多个任务,且调用start方法,开启新的线程. 多个NSOperation,且每个NSOperation中只有一个任务,且每个NSOperation调用start方法 ,不会开启新的线程. 多个任务,添加到一个队列当中, 多个任务添加到主队列