当初学习多线程这一块的时候,时间比较匆忙,没有细细考虑,而今重新学一次,算是复习和总结吧。

 #import "ViewController.h"

 @interface ViewController ()

 @end

 @implementation ViewController

 /*
通过调用[self invocationOperation]的log,可以发现,在不加入queue的情况下,默认是在主线程中同步执行操作的 而通过调用[self blockOperation]的log,可以发现,在不加入queue的情况下,同一个block里的任务是,默认是在主线程中同步执行操作的。但是,如果有多个block操作,会是并发、异步执行的 NSBlockOperation 可以设置监听,调用[self opeationListen] 在完成任务后,可以设置完成这个任务想要执行的操作 调用[self operationQueue]的log,可以发现,在不设置依赖的情况下,任务是并发、异步执行的 而设置依赖的情况下,设置了依赖的任务按照所设定的顺序调用,而没有设置的,则是并发、异步执行
*/
- (void)viewDidLoad {
[super viewDidLoad]; [self opeationListen];
} - (void)invocationOperation
{
NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downLoadImage) object:nil];
[invocation start];
} - (void)blockOperation
{
NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init]; [blockOperation addExecutionBlock:^{
for (int i = ; i<; i++) {
NSLog(@"blockOperation------下载图片1---%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}
}]; [blockOperation addExecutionBlock:^{
NSLog(@"blockOperation__2 --- %@",[NSThread currentThread]);
}]; [blockOperation addExecutionBlock:^{
NSLog(@"blockOperation__3 --- %@",[NSThread currentThread]);
}]; [blockOperation start];
} - (void)opeationListen
{
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = ; i<; i++) {
NSLog(@"opeationListen------下载图片---%@", [NSThread currentThread]);
}
}]; blockOperation.completionBlock = ^{
// ...下载完图片后想做事情
NSLog(@"NSBlockOperation------下载图片完毕---%@", [NSThread currentThread]);
}; [blockOperation start];
} - (void)downLoadImage
{
for (int i = ; i < ; i++) {
NSLog(@"downLoadImage----正在下载----image---%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.2];
}
} - (void)run
{
for (int i = ; i<; i++) {
NSLog(@"run---正在跑步-----%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:0.2];
}
}
- (void)operationQueue
{
NSInvocationOperation *invocationOperation_1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downLoadImage) object:nil]; NSInvocationOperation *invocationOperation_2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; NSBlockOperation *blockOperation_1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = ; i < ; i++) {
NSLog(@"blockOperation_1------下载图片---%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}
}]; NSBlockOperation *blockOperation_2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = ; i < ; i++) {
NSLog(@"blockOperation_2------下载视频---%@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
}
}]; //设置依赖
[blockOperation_2 addDependency:blockOperation_1]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //设置最大并发数(一般设置为2~~3个)
queue.maxConcurrentOperationCount = ; [queue addOperations:@[invocationOperation_1, invocationOperation_2, blockOperation_1, blockOperation_2] waitUntilFinished:NO];
}
@end

NSOperation和NSOperationQueue的一些基本操作的更多相关文章

  1. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  2. 多线程之NSOperation和NSOperationQueue

    这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOp ...

  3. 用NSOperation和NSOperationQueue实现多线程编程

    1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NS ...

  4. OC - 14.NSOperation与NSOperationQueue

    简介 通过NSOperation与NSOperationQueue的组合也能实现多线程 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现 NSOpera ...

  5. 多线程下的NSOperation和NSOperationQueue的使用

    多线程下的NSOperation和NSOperationQueue的使用 NSOperation和NSOperationQueue的介绍: NSOperation是Cocoa中的一个抽象类,用来封装单 ...

  6. Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

    1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...

  7. iOS 多线程 NSOperation、NSOperationQueue

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...

  8. NSOperation、NSOperationQueue(III)

    NSOperation.NSOperationQueue 常用属性和方法归纳 NSOperation 常用属性和方法 a. 取消操作方法 //可取消操作,实质是标记 isCancelled 状态. - ...

  9. NSOperation、NSOperationQueue(II)

    NSOperationQueue 控制串行执行.并发执行 NSOperationQueue 创建的自定义队列同时具有串行.并发功能 这里有个关键属性 maxConcurrentOperationCou ...

随机推荐

  1. Nginx防爬虫或限制浏览器访问

    假定一个场景:某个网站它可能不希望被网络爬虫抓取,例如测试环境不希望被抓取,以免对用户造成误导,那么需要在该网站中申明,本站不希望被抓取.有如下方法: 方法一:修改nginx.conf,禁止网络爬虫的 ...

  2. zabbix3.0 安装时出现PHP Parse error: syntax error

    httpd的错误日志 [Sun Mar :: ] [error] [client 由于系统yum默认安装的php版本是5.3.3 zabbix 3.0支持的平台,只支持php5.4以上的版本https ...

  3. C语言学习笔记 (002) - C++中引用和指针的区别(转载)

    下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图 ...

  4. Vue.js 添加组件

    <!DOCTYPE HTML> <html> <head> <title>vue.js hello world</title> <sc ...

  5. Magento模块升级修改数据库表结构

    Magento支持在模块中创建.删除.更新数据库表及字段.通过该方式,在插件开发的过程中,添加和修改字段变成了一件非常轻松的事情.只需要修改模块的版本号,同时在文件中添加一个符合命名规则的脚本就可以了 ...

  6. Mac Apache Maven 配置

    1.配置准备工作 1)配置 Maven 准备工作 下载相关软件 apache-maven-3.5.3.zip Maven 官网 Maven for Mac 配置软件下载地址,密码:q9u3. Mave ...

  7. root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题

    可以写成:$JAVA_HOME/bin 3. source /root/.bash_profile 发现 jps 等命令运行正常了

  8. 类名.class和getClass()区别

    class叫做“类字面量”,因class是关键字, 所以class编译时确定,getclass()运行时根据实际实例确定.String.class 是能对类名的引用取得在内存中该类型class对象的引 ...

  9. C# 可选参数 命名参数

    1.可选参数 可选参数是.NET4中新添加的功能,应用可选参数的方法在被调用的时可以选择性的添加需要的参数,而不需要的参数由参数默认值取代. class Program { /// <summa ...

  10. 开关电源电路中变压器次级输出绕组RC串联并接在二极管两端的作用

    二极管反向恢复时会产生浪涌电压,这里RC主要是吸收二极管D1产生的浪涌电压,防止二极管损坏. 寄生电容:寄生电容一般是指电感,电阻,芯片引脚等在高频情况下表现出来的电容特性.实际上,一个电阻等效于一个 ...