并发:同一个时间内运行多个任务。又叫共行性,是指处理多个同时性活动的能力。网络
并行:是指两个并发的任务同时发生。并发
并发不必定并行,并发不必定要同时发生。async
举个例子:spa
有两个快递分别要送到目的地,有如下两种方案:线程
(1)一个快递员分别把两个快递送到对应的目的地。(并发)3d
(2)两个快递员同时送一个快递到目的地。(并行)code
在iOS中,常常能够看见有这样的需求,就是一个方法要等另一个方法执行完毕再作相对应的处理,好比说一些网络请求,须要根据上一个请求的返回值作相对应的处理再执行第二个请求,因此咱们不能让两个请求同时去请求网络。下面就记录如下经过GCD和NSOperationQueue来控制并发。blog
dispatch_semaphore
队列
信号量是一个整型值而且具备初始计数值,信号量一般支持两个操做:通知和等待。当信号被通知的时候计数值会增长,当信号量在线程上等待的时候,必要的状况下线程会被阻塞掉,直至信号被通知时计数值大于0,而后线程会减小这个计数继续工做。it
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 (int i = 0 ; i < 100; i++) { NSLog(@"i的值是:%d",i); } dispatch_semaphore_signal(sem); }); dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); for (int j = 0; j < 10; j ++) { NSLog(@"j的值是:%d",j); }
运行结果是:
NSOperationQueue
在不添加依赖的状况下:
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount = 10; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 1000; i++) { NSLog(@"执行并发队列1:%d",i); } }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = 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 (int i = 0; i < 1000; i++) { NSLog(@"执行并发队列1:%d",i); } }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = 0; i < 1500; i++) { NSLog(@"执行并发队列2:%d",i); } }]; [operation1 addDependency:operation2]; //添加依赖,operation1要依赖operation2才能继续执行 [queue addOperation:operation1]; [queue addOperation:operation2];
打印的结果: