多线程-NSOperation

原创 2016年05月30日 20:42:29

基本概念
//操作:(任务)想要执行的操作,想要做的事情
//队列:专门用来存放任务的

//使用步骤
//1.创建一个队列对象
//2.创建一个任务对象
//3.将任务对象放到队列中(系统会自动将任务从队列中取出来,并且开启新的线程去执行任务)

=====基本使用=====
//NSInvocationOperation创建任务
-(void)test1{
//1.创建队列
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
//2.创建任务
//参数1:响应消息的对象
//参数2:需要执行的操作
//参数3:选择器中方法实参
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longTimeOperation:) object:@0];
//3.将单个任务添加到队列中
[queue addOperation:operation];
//4.将多个任务添加到队列中
for (int i = 0; i<20; i++) {
//创建一个任务
NSInvocationOperation* OP = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longTimeOperation:) object:[NSNumber numberWithInt:i]];
OP.name = [NSString stringWithFormat:@”我是子线程”];
//将任务放到队列中
[queue addOperation:OP];
}
}
-(void)longTimeOperation:(NSNumber*)number{
NSLog(@”%@,%@”,[NSThread currentThread],number);
}
//NSBlockOperation创建任务
-(void)test2{
//2.创建任务/操作
NSBlockOperation* Op = [NSBlockOperation blockOperationWithBlock:^{
[self longTimeOperation:@19];
}];
[self.queue addOperation:Op];
//========添加多个任务========
for (int i = 0; i<20; i++) {
NSBlockOperation* Op = [NSBlockOperation blockOperationWithBlock:^{
[self longTimeOperation:@(i)];
}];
[self.queue addOperation:Op];
}
}
-(void)test3{
//将一个bolck类型的任务添加到队列中
[self.queue addOperationWithBlock:^{
//需要执行的操作
[self longTimeOperation:@0];
}];
}
-(void)test4{
[self.queue addOperationWithBlock:^{
NSData* data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@”http://preview.quanjing.com/tongro_rf002/tds003tg2260.jpg“]];
UIImage* image = [UIImage imageWithData:data];
//回到主线程
//拿到主队列
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.loadIMAGE.image = image;
NSLog(@”%@”,[NSThread currentThread]);
}];
}];
}

=====高级应用=====
//最大并发数(限制每次同时执行的任务的个数),默认有多少个任务同时开启多少个线程
-(void)test5{
//设置队列的最大并发数(2~3)
self.queue.maxConcurrentOperationCount = 3;
for (int i = 0; i<200; i++) {
[self.queue addOperationWithBlock:^{
[self longTimeOperation:@(i)];
sleep(1);
}];
}
}
//暂停、恢复队列
//暂停是暂停从队列中取出任务来执行,但是已经从队列里面取出来的任务,不再受队列的限制
//test6
- (IBAction)btnClick:(UIButton *)sender {
static int i = 0;
if (i == 0 ) {
i = 1;

    [sender setTitle:@"开始" forState:UIControlStateNormal];
    [self.queue setSuspended:YES];
}else{
    i = 0;
    [sender setTitle:@"暂停" forState:UIControlStateNormal];
    [self.queue setSuspended:NO];
}

}
//取消队列
//将队列中所有的任务从队列中移除,不可以恢复。但是已经从队列中取出的任务不会被取消
//test7
- (IBAction)cancel:(id)sender {
[self.queue cancelAllOperations];
// [[NSOperationQueue mainQueue] cancelAllOperations];
}
//操作依赖
-(void)test8{
NSBlockOperation* block1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”1”);
}];
NSBlockOperation* block2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”2”);
}];
//添加依赖关系,让B依赖A(A执行完再执行B);注意:1.依赖关系一定要在任务添加到队列之前添加2.不能循环依赖
[block2 addDependency:block1];
[self.queue addOperations:@[block1,block2] waitUntilFinished:NO];
NSLog(@”123”);
}

iOS多线程编程技术NSThread、Cocoa NSOperation、GCD三者使用详解

简介 iOS有三种多线程编程的技术,分别是: (一)NSThread (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch)...
  • lgm252008
  • lgm252008
  • 2014年10月13日 09:18
  • 14361

【OC】IOS多线程之NSoperation和GCD的比较

GCD是基于c的底层api,NSOperation属于object-c类。ios 首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现...
  • chenglibin1988
  • chenglibin1988
  • 2013年10月12日 17:19
  • 14451

在NSOperation等待异步请求结束

看SDWebImage的源代码,看到了这个解决方法: @implementation ViewController - (void)viewDidLoad {...
  • gaoyp
  • gaoyp
  • 2014年08月28日 09:44
  • 1519

iOS开发 自定义NSOPeration

iOS多线程开发中,NSOperation是我们经常使用的,有时系统自带的两个类NSInvocationOperation和NSBlockOperation不能满足我们的需求时就需要我们自定义。 自...
  • huiqin131460
  • huiqin131460
  • 2016年09月13日 16:02
  • 1687

多线程——NSOperation

NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQu...
  • yejiexiaobai
  • yejiexiaobai
  • 2015年11月07日 09:25
  • 163

多线程 NSOperation

苹果文档: – removeDependency:  删除指定的依赖关系  NSOperation 是另一个”并发技术”,程序员不需要关心,,并发技术 不是多线程 ...
  • qq_33030123
  • qq_33030123
  • 2015年11月22日 15:05
  • 117

多线程-NSOperation

NSOperation是基于GCD进行封装的一个抽象类 使用的时候是使用NSInvocationOperation,NSBlockOperation,及NSOperation的子类 NSOpera...
  • IReallyFuckTheDog
  • IReallyFuckTheDog
  • 2015年09月21日 22:27
  • 111

iOS开发 自定义并发NSOperation实战

前一章节已经介绍了如何自定义并发NSOperation,本节将其应用到具体实例,如果自定义并发NSOperation不会,请移步:http://blog.csdn.net/huiqin131460/a...
  • huiqin131460
  • huiqin131460
  • 2016年09月14日 14:44
  • 712

多线程 NSOperation

一.    NSThread 可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步,加锁问题。造成一些性能上的开销。我们可以配合使用NSOperation 和NSOperationQ...
  • qingsi00
  • qingsi00
  • 2013年05月14日 17:04
  • 1212

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

(1)GCD实现的同步异步、串行并行。 ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 [objc] view plain...
  • shaobo8910
  • shaobo8910
  • 2016年03月17日 11:48
  • 874
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程-NSOperation
举报原因:
原因补充:

(最多只允许输入30个字)