设为首页 加入收藏

TOP

iOS 多线程 NSOperation、NSOperationQueue(三)
2019-08-31 00:20:48 】 浏览:111
Tags:iOS 线程 NSOperation NSOperationQueue
ationQueue 一共有两种队列:主队列、自定义队列。其中自定义队列同时包含了串行、并发功能。下边是主队列、自定义队列的基本创建方法和特点。

  • 主队列
    • 凡是添加到主队列中的操作,都会放到主线程中执行(注:不包括操作使用addExecutionBlock:添加的额外操作,额外操作可能在其他线程执行,感谢指正)。
// 主队列获取方法 NSOperationQueue *queue = [NSOperationQueue mainQueue]; 
  • 自定义队列(非主队列)
    • 添加到这种队列中的操作,就会自动放到子线程中执行。
    • 同时包含了:串行、并发功能。
// 自定义队列创建方法 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

4.3 将操作加入到队列中

上边我们说到 NSOperation 需要配合 NSOperationQueue 来实现多线程。

那么我们需要将创建好的操作加入到队列中去。总共有两种方法:

  1. - (void)addOperation:(NSOperation *)op;
    • 需要先创建操作,再将创建好的操作加入到创建好的队列中去。
/** * 使用 addOperation: 将操作加入到操作队列中 */ - (void)addOperationToQueue { // 1.创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.创建操作 // 使用 NSInvocationOperation 创建操作1 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task1) object:nil]; // 使用 NSInvocationOperation 创建操作2 NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task2) object:nil]; // 使用 NSBlockOperation 创建操作3 NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"3---%@", [NSThread currentThread]); // 打印当前线程 } }]; [op3 addExecutionBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"4---%@", [NSThread currentThread]); // 打印当前线程 } }]; // 3.使用 addOperation: 添加所有操作到队列中 [queue addOperation:op1]; // [op1 start] [queue addOperation:op2]; // [op2 start] [queue addOperation:op3]; // [op3 start] } 

输出结果:


 
 
  • 可以看出:使用 NSOperation 子类创建操作,并使用 addOperation:将操作加入到操作队列后能够开启新线程,进行并发执行。
  1. - (void)addOperationWithBlock:(void (^)(void))block;
    • 无需先创建操作,在 block 中添加操作,直接将包含操作的 block 加入到队列中。
/** * 使用 addOperationWithBlock: 将操作加入到操作队列中 */ - (void)addOperationWithBlockToQueue { // 1.创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.使用 addOperationWithBlock: 添加操作到队列中 [queue addOperationWithBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程 } }]; [queue addOperationWithBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"2---%@", [NSThread currentThread]); // 打印当前线程 } }]; [queue addOperationWithBlock:^{ for (int i = 0; i < 2; i++) { [NSThread sleepForTimeInterval:2]; // 模拟耗时操作 NSLog(@"3---%@", [NSThread currentThread]); // 打印当前线程 } }]; } 

输出结果:


 
 
  • 可以看出:使用 addOperationWithBlock: 将操作加入到操作队列后能够开启新线程,进行并发执行。

5. NSOperationQueue 控制串行执行、并发执行

之前我们说过,NSOperationQueue 创建的自定义队列同时具有串行、并发功能,上边我们演示了并发功能,那么他的串行功能是如何实现的?

这里有个关键属性 maxConcurrentOperationCount,叫做最大并发操作数。用来控制一个特定队列中可以有多少个操作同时参与并发执行。

注意:这里 maxConcurrentOperationCount控制的不是并发线程的数量,而是一个队列中同时能并发执行的最大操作数。而且一个操作也并非只能在一个线程中运行。

  • 最大并发操作数:maxConcurrentOperationCount
    • maxConcurrentOperationCount默认情况下为-1,表示不进行限制,可进行并发执行。
    • maxConcurrentOperationCount为1时,队列为串行队列。只能串行执行。
    • maxConcurrentOperationCount大于1时,队列为并发队列。操作并发执行,当然这个值不应超过系统限制,即使自己设置一个很大的值,系统也会自动调整为 min{自己设定的值,系统设定的默认最大值}。
/** * 设置 MaxConcurrentOperationCount(最大并发操作数) */ - (void)setMaxConcurrentOperationCount { // 1.创建队列 NSOperationQueue *queue = [[NS
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[iOS]异常捕捉 下一篇ipa的plist文件查看

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目