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

 #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. 强制IE浏览器或WebBrowser控件

    注册表: 32 bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BRO ...

  2. solrj索引操作

    添加索引 Solr添加文档至索引: http://www.cnblogs.com/dennisit/p/3621717.html 删除索引: 每天索引记录有一个唯一标识,索引的删除通过唯一标识操作,如 ...

  3. 【struts2】自定义更强大的logger拦截器

    Struts2自带的logger拦截器只是打印出了Action所对应的URL以及执行的方法名称,这对实际开发来说是肯定不够的.实际开发中为了调试方便,要记录的信息比较多,通常需要把这次请求相关的几乎所 ...

  4. centos yum源

    #remi的源 rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm rpm --import /etc/pki/r ...

  5. 还没被玩坏的robobrowser(1)-简介

    今天偶然发现了一个很有意思的python库——robobrowser.简单的看了一下,觉得这个东东作为轻量的爬虫还是很适合的.另外这个做一些简单的web测试也未尝不可. 好了,那么问题来了. 什么是r ...

  6. Android MediaScannerJNI源代码具体解释

    1.简单介绍 MediaScannerJNI的在MediaScanner中的地位可參考 Android MediaScanner 总纲 MediaScanner JNI文件名称: android_me ...

  7. 跟我学SharePoint 2013视频培训课程——什么是SharePoint 2013(1)

    课程简介 第一天,介绍什么是SharePoint 2013. 视频 SharePoint 2013 交流群 41032413

  8. 基于tornado的爬虫并发问题

    tornado中的coroutine是python中真正意义上的协程,与python3中的asyncio几乎是完全一样的,而且两者之间的future是可以相互转换的,tornado中有与asyncio ...

  9. Maven 使用国内镜像

    1 修改maven 的配置文件 settings.xml,添加阿里云的一个中央仓库. 2 找到maven 的配置文件,一般在 maven 安装目录 apache-maven-3.5.0\conf 文件 ...

  10. 使用Talend Open Studio将数据分步从oracle导入到hive中

    先使用Tos建立模型,将Oracle中的数据导入到本地: build job后,形成独立可以运行的程序: 将生成的zip文件,上传到hadoop集群上,有hive环境的机器上: [hive@h1 wo ...