设为首页 加入收藏

TOP

iOS 多线程 NSOperation、NSOperationQueue(二)
2019-08-31 00:20:48 】 浏览:112
Tags:iOS 线程 NSOperation NSOperationQueue
可以为 NSBlockOperation 添加额外的操作。这些操作(包括 blockOperationWithBlock 中的操作)可以在不同的线程中同时(并发)执行。只有当所有相关的操作已经完成执行时,才视为完成。

如果添加的操作多的话,blockOperationWithBlock:中的操作也可能会在其他线程(非当前线程)中执行,这是由系统决定的,并不是说添加到 blockOperationWithBlock:中的操作一定会在当前线程中执行。(可以使用 addExecutionBlock:多添加几个操作试试)。

/** * 使用子类 NSBlockOperation * 调用方法 AddExecutionBlock: */ - (void)useBlockOperationAddExecutionBlock { // 1.创建 NSBlockOperation 对象 NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程 } }]; // 2.添加额外的操作 [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"2---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"3---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"4---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"5---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"6---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"7---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"8---%@", [NSThread currentThread]); // 打印当前线程 } }]; // 3.调用 start 方法开始执行操作 [op start]; } 

输出结果:


 
 
  • 可以看出:使用子类 NSBlockOperation,并调用方法 AddExecutionBlock:的情况下,blockOperationWithBlock:方法中的操作 和 addExecutionBlock:中的操作是在不同的线程中异步执行的。而且,这次执行结果中 blockOperationWithBlock:方法中的操作也不是在当前线程(主线程)中执行的。从而印证了blockOperationWithBlock:中的操作也可能会在其他线程(非当前线程)中执行。

一般情况下,如果一个 NSBlockOperation 对象封装了多个操作。NSBlockOperation 是否开启新线程,取决于操作的个数。如果添加的操作的个数多,就会自动开启新线程。当然开启的线程数是由系统来决定的。

4.1.3 使用自定义继承自 NSOperation 的子类

如果使用子类 NSInvocationOperation、NSBlockOperation 不能满足日常需求,我们可以使用自定义继承自 NSOperation 的子类。可以通过重写 main或者 start方法 来定义自己的 NSOperation 对象。重写main方法比较简单,我们不需要管理操作的状态属性 isExecuting isFinished。当 main执行完返回的时候,这个操作就结束了。

先定义一个继承自 NSOperation 的子类,重写main方法。

// YSCOperation.h 文件 #import <Foundation/Foundation.h> @interface YSCOperation : NSOperation @end // YSCOperation.m 文件 #import "YSCOperation.h" @implementation YSCOperation - (void)main { if (!self.isCancelled) { for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; NSLog(@"1---%@", [NSThread currentThread]); } } } @end 

然后使用的时候导入头文件YSCOperation.h

/** * 使用自定义继承自 NSOperation 的子类 */ - (void)useCustomOperation { // 1.创建 YSCOperation 对象 YSCOperation *op = [[YSCOperation alloc] init]; // 2.调用 start 方法开始执行操作 [op start]; } 

输出结果:


 
 
  • 可以看出:在没有使用 NSOperationQueue、在主线程单独使用自定义继承自 NSOperation 的子类的情况下,是在主线程执行操作,并没有开启新线程。

下边我们来讲讲 NSOperationQueue 的创建。

4.2 创建队列

NSOper

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[iOS]异常捕捉 下一篇ipa的plist文件查看

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目