iOS- dispatch_semaphore和NSOperationQueue并发

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

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

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

举个例子:

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

(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 (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];

打印的结果:

iOS- dispatch_semaphore和NSOperationQueue并发

时间: 2024-10-16 14:45:35

iOS- dispatch_semaphore和NSOperationQueue并发的相关文章

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

IOS多线程--NSOperation\NSOperationQueue

iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术 1.GCD是纯C的,对面向对象的程序员不友好 2.GCD对编程管理还不是很强大 NSOperation 其实底层实现是基于GCD来做的 dispatch_queue_t ==  NSOperationQueue dispatch_async == NSOperation dispatch_sync  == NSOperation NSOperation是个抽象类 使用它的两个子类 NSInvocationOperat

iOS 多线程-NSOperation/NSOperationQueue

简介NSOperationQueue(操作队列)是由GCD提供的队列模型的Cocoa抽象,是一套Objective-C的APIGCD提供了更加底层的控制,而操作队列则在GCD之上实现了一些方便的功能,这些功能对于开发者而言通常是最好最安全的选择队列及操作 是面向对象的线程技术提供了一些在GCD中不容易实现的特性,如:限制最大并发数量.操作之间的依赖关系 NSOperationQueue有两种不同类型的队列:主队列和自定义队列主队列运行在主线程上自定义队列在后台执行队列处理的任务是NSOperat

IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue

1.前言  iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处理多个任务同时执行的时候,一定都会使用到这两个框架,而且GCD依靠它简洁的语法和对block的运用一直很受大家的青睐.ios开发中你一定明白 这样一条原则:"任何用于界面ui刷新和用户交互的操作都要放在主线程来操作,任何耗时或者耗CPU的任务必须在异步线程去操作*",----小白都会问为什

IOS开发多线程篇—多线程技术的详解

并发所描述的概念就是同时运行多个任务.这些任务可能是以在单核 CPU 上分时(时间共享)的形式同时运行,也可能是在多核 CPU 上以真正的并行方式来运行. OS X 和 iOS 提供了几种不同的 API 来支持并发编程.每一个 API 都具有不同的功能和使用限制,这使它们适合不同的任务.同时,这些 API 处在不同的抽象层级上.我们有可能用其进行非常深入底层的操作,但是这也意味着背负起将任务进行良好处理的巨大责任. 实际上,并发编程是一个很有挑战的主题,它有许多错综复杂的问题和陷阱.当开发者在使

OC中并发编程的相关API和面临的挑战

OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文章出炉,2013年7月份的主题是并发编程,今天挑选其中的第2篇文章(Concurrent Programming: APIs and Challenges)进行翻译,与大家分享一下主要内容.由于内容比较多,我将分两部分翻译(API和难点)完成,翻译中,如有错误,还请指正. 目录 1.介绍 2.OS

iOS进阶面试题----多线程

本文转载至 http://blog.csdn.net/xunyn/article/details/14525243 ios面试题多核并发应用 iOS面试题系列: iOS如何面试 iOS面试题(一) iOS基础面试题(二) iOS基础面试题(三) iOS基础面试题(四) iOS进阶面试题----Block部分 1 多线程是什么 多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU

appium 并发测试

Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: -p Appium的主要端口 -U 设备id -bp Appium bootstrap端口 --chromedriver-port chromedriver端口(当使用了webviews或者chrome) --selendroid-port selendroid端口(当使用了selendroid) 如

Android并发测试

Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: -p Appium的主要端口 -U 设备id -bp Appium bootstrap端口 --chromedriver-port chromedriver端口(当使用了webviews或者chrome) --selendroid-port selendroid端口(当使用了selendroid) 更多参数的解释详见 her