NSOperation的子类 NSInvocationOperation NSBlockOperation 自定义子类继承NSOperation,实现内部相应的方法 关于NSInvocationOperation NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector (run1) object:nil]; NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector (run1) object:nil]; NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self
NSOperation是一个抽象类,它不能直接使用,所以你必须使用NSOperation子类,使用最多的是它的两个子类:NSInvocationOperation和NSBlockOperation,但你也可以继承 2、NSInvocationOperation:使用这个类来初始化一个操作,它包括指定对象的调用selector。 ? [operation isConcurrent]; 二、NSInvocationOperation 使用这个类来初始化一个操作,它包括指定对象的调用selector。 ? Paste_Image.png ps: 使用NSInvocationOperation开启一个任务默认是在主线程中执行,只有添加到队列中才会开启新的线程。 四、自定义NSOperation 如果NSInvocationOperation和NSBlockOperation对象不能满足需求,可以自定义NSOperation,添加我们想要的功能。
目录 一、NSInvocationOperation 二、NSBlockOperation 三、NSOperationQueue NSOperation 是一个抽象类,线程安全,不需要添加额外的锁 使用其子类 :NSInvocationOperation 和 NSBlockOperation 1、NSInvocationOperation 一个对象,表示一个任务 默认在主线程中同步顺序执行,想要并行异步,需要搭配 NSBlockOperation 一个对象,可以创建多个任务 blockOperationWithBlock 添加的任务默认在主线程中 addExecutionBlock 添加任务,会开启多个线程,并发执行 一、NSInvocationOperation 一个 NSInvocationOperation 对象表示一个任务,需要手动调用 start 开启。 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector
这个类是一个抽象类,通常情况下,我们会使用NSInvocationOperation和NSBlockOperation这两个子类进行多线程的开发,当然我们也可以写继承于NSOperation的类,封装我们自己的操作类 3、使用NSInvocationOperation调用方法 根据选择器创建一个对象 - (instancetype)initWithTarget:(id)target selector:(SEL)sel NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector NSOperationQueue * queue = [[NSOperationQueue alloc]init]; NSInvocationOperation * op1 = [[NSInvocationOperation
使用子类 NSInvocationOperation /** * 使用子类 NSInvocationOperation */ - (void)useInvocationOperation { // 1.创建 NSInvocationOperation 对象 NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget 注意:和上边 NSInvocationOperation 使用一样。因为代码是在主线程中调用的,所以打印结果为主线程。如果在其他线程中执行操作,则打印结果为其他线程。 创建操作1 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@ selector(task1) object:nil]; // 使用 NSInvocationOperation 创建操作2 NSInvocationOperation *op2 =
在 NSOperation 中,我们使用 NSOperation 子类 NSInvocationOperation、NSBlockOperation,或者自定义子类来封装操作。 4.1.1 使用子类 NSInvocationOperation /** * 使用子类 NSInvocationOperation */ - (void)useInvocationOperation { // 1.创建 NSInvocationOperation 对象 NSInvocationOperation *op = [[NSInvocationOperation alloc 创建操作1 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@ selector(task1) object:nil]; // 使用 NSInvocationOperation 创建操作2 NSInvocationOperation *op2 =
封装的操作放到⼀条新线程中执⾏ ②.NSOperation的子类 NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类 使用NSOperation⼦类的方式有3种: (1)NSInvocationOperation (2)NSBlockOperation (3)自定义子类继承NSOperation,实现内部相应的⽅法 2、具体说明 ①.NSInvocationOperation子类 脱离队列,在主线程中执行 要执行,必须调用 [operation start]; //创建操作对象,封装要执行的任务 //NSInvocationOperation 封装操作 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
NSOperation 使用 2.1 NSInvocationOperation 2.2 NSBlockOperation 3. NSOperation:操作 NSOperation 类是一个抽象类,不能直接使用它来封装任务,而是使用系统定义的子类( NSInvocationOperation 或 NSBlockOperation NSOperation 使用 2.1 NSInvocationOperation 默认情况下,调用 NSOperation 的 start 方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作 对象 NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector 对象 NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector
,实现内部相应的方法 (自定义) (一) NSInvocationOperation NSInvocationOperation初始化的方法有两个,分别如下: - (nullable instancetype NSInvocationOperation对象。 注意:NSInvocationOperation实例对象直接调用start方法是在当前线程执行操作封装的任务。而不是在子线程中执行。 也就是说,NSInvocationOperation实例对象直接调用start方法不会开启新线程异步执行,而是同步执行。 只有将NSInvocationOperation实例对象添加到一个NSOperationQueue中,才会异步执行操作。
封装的操作放到一条新线程中执行 二、NSOperation 的子类 NSOperation 是个抽象类,并不具备封装操作的能力,必须使用它的子类 使用 NSOperation 子类的方式有 3 种 NSInvocationOperation NSBlockOperation 自定义子类继承 NSOperation ,实现内部相应的方法 三、具体使用 1.NSInvocationOperation 的使用 创建 NSInvocationOperation
3、用法 NSOperation实现 一个是直接使用NSInvocationOperation、NSBlockOperation两个子类,一个是自己实现NSOperation的子类 NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(invocationOperationAction
需要注意的是,NSOperation是个抽象类,实际运用时中需要使用它的子类,有三种方式: 使用子类NSInvocationOperation 使用子类NSBlockOperation 定义继承自 No.2:NSOperation的三种创建方式 NSInvocationOperation的使用:创建NSInvocationOperation对象并关联方法,之后start。 - (void)testNSInvocationOperation { // 创建NSInvocationOperation NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationOperation) object: NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self
NSOperation&NSOperationQueue NSOperation 是苹果公司对 GCD 的封装,NSOperation 只是一个抽象类,不能用于封装任务, 所以需要用它的子类NSInvocationOperation 示例代码如下: 相比NSInvocationOperation推荐使用NSBlockOperation,因为它代码简单,同时由于闭包性使它没有传参问题,NSInvocationOperation在Swift 相比NSInvocationOperation推荐使用NSBlockOperation,代码简单,同时由于闭包性使它没有传参问题.
后文会讲),但NSOperation类的这两个方法是空方法,没有干任何事情,因此,我们需要自定义继承NSOperation类并重写相关方法,OC也提供了两个子类供我们使用NSBlockOperation和NSInvocationOperation 对象,指定执行的对象和方法 该方法可以接收一个参数即object */ NSInvocationOperation *invocationOperation = [[NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task:) 使用Foundation提供的NSBlockOperation和NSInvocationOperation很方便,这两个子类已经帮我们完成了各个重要属性的设置操作,当block或传入的方法任务在执行时会设置 *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task:)
detachNewThreadSelector:@selector(loadImageWithThreadName:) toTarget:self withObject:@"NSThread"]; 6 } 7 } 3.NSInvocationOperation 的使用,新建一个调用操作,然后添加到队列中执行,代码如下: 1 //NSInvocationOperation 2 - (IBAction)tapInvocationOperation:(id)sender NSOperationQueue alloc] init]; 8 9 for (int i = 0;i < 10; i ++) { 10 //实例化一个调用操作,来执行数据请求 11 NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImageWithThreadName
如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。 写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。 写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
分别是:NSInvocationOperation 和 NSBlockOperation 。创建一个 Operation 后,需要调用 start 方法来启动任务,它会默认在当前队列同步执行。 #.创建NSInvocationOperation对象 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget
队列的使用、线程间的通信 延迟执行、一次性代码、队列组、单例模式-ARC、单例模式-MRC、用宏抽取单例模式 NSOperation NSOperation和NSOperationQueue的概念理解、NSInvocationOperation NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation.
如果内存中没有图片缓存,那么生成 NSInvocationOperation 添加到队列,从硬盘查找图片是否已被下载缓存。 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。 写文件到硬盘在单独 NSInvocationOperation 中完成,避免拖慢主线程。