iOS-dispatch_semaphore和NSOperationQueue并发

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

并发:同一个时间内运行多个任务。又叫共行性,是指处理多个同时性活动的能力。

并行:是指两个并发的任务同时发生。

并发不一定并行,并发不一定要同时发生。

举个例子:

有两个快递分别要送到目的地,有以下两种方案:

(1)一个快递员分别把两个快递送到对应的目的地。(并发)

(2)两个快递员同时送一个快递到目的地。(并行)

在iOS中,经常可以看见有这样的需求,就是一个方法要等另外一个方法执行完毕再做相对应的处理,比如说一些网络请求,需要根据上一个请求的返回值做相对应的处理再执行第二个请求,所以我们不能让两个请求同时去请求网络。下面就记录以下通过GCD和NSOperationQueue来控制并发。

dispatch_semaphore

信号量是一个整型值并且具有初始计数值,信号量通常支持两个操作:通知和等待。当信号被通知的时候计数值会增加,当信号量在线程上等待的时候,必要的情况下线程会被阻塞掉,直至信号被通知时计数值大于0,然后线程会减少这个计数继续工作。

GCD中又3个信号量有关的操作:

dispatch_semaphore_create信号量创建

dispatch_semaphore_signal发送通知

dispatch_semaphore_wait信号量等待

__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);

dispatch_queue_t queue= dispatch_queue_create("testBlock", NULL);

dispatch_async(queue,^{for(inti =0; i <100; i++) {

NSLog(@"i的值是:%d",i);

}

dispatch_semaphore_signal(sem);

});

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);for(intj =0; j <10; j ++) {

NSLog(@"j的值是:%d",j);

}

运行结果是:

NSOperationQueue

在不添加依赖的情况下:

NSOperationQueue *queue =[[NSOperationQueue alloc] init];

queue.maxConcurrentOperationCount=10;

NSBlockOperation*operation1 = [NSBlockOperation blockOperationWithBlock:^{for(inti =0; i <1000; i++) {

NSLog(@"执行并发队列1:%d",i);

}

}];

NSBlockOperation*operation2 = [NSBlockOperation blockOperationWithBlock:^(){for(inti =0; i <1500; i++) {

NSLog(@"执行并发队列2:%d",i);

}

}];

[queue addOperation:operation1];

[queue addOperation:operation2];

运行结果:

两个NSOperation是并发打印的。

添加依赖控制后:

NSOperationQueue *queue =[[NSOperationQueue alloc] init];

queue.maxConcurrentOperationCount=10;

NSBlockOperation*operation1 = [NSBlockOperation blockOperationWithBlock:^{for(inti =0; i <1000; i++) {

NSLog(@"执行并发队列1:%d",i);

}

}];

NSBlockOperation*operation2 = [NSBlockOperation blockOperationWithBlock:^(){for(inti =0; i <1500; i++) {

NSLog(@"执行并发队列2:%d",i);

}

}];

[operation1 addDependency:operation2]; //添加依赖,operation1要依赖operation2才能继续执行

[queue addOperation:operation1];

[queue addOperation:operation2];

打印的结果:

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航