ios开发多线程GCD的学习(一)

本文介绍了Grand Central Dispatch (GCD) 的基本概念及其在多线程管理中的应用。包括串行队列SerialDispatchQueue和并发队列ConcurrentDispatchQueue的区别与使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想要执行的任务追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。

一、Dispatch Queue

 Dispatch Queue是用来执行任务的队列,是GCD中最基本的元素之一。Dispatch Queue分为两种,即:
  • Serial Dispatch Queue,按添加进队列的顺序(先进先出)一个接一个的执行
  • Concurrent Dispatch Queue,并发执行队列里的任务
1、Serial Dispatch Queue只使用了一个线程,队列里的线程一个个顺序执行,当应用中需要任务按照某一个特定的顺序执行时,可使用串行队列代替锁去保护资源的共享,使各个线程在一个可预知的顺序下执行。其中我们可通过两种方式获取一个Serial Dispatch Queue,即:
     (1)自己手动创建一个队列

//参数一:队列的名称,一般使用倒序的全域名(可选)有名称的队列有利于以后的调试

    //参数二:队列的类型,当为nil时返回Serial Dispatch Queue,当为DISPATCH_QUEUE_CONCURRENT返回的Concurrent Dispatch Queue

    dispatch_queue_t myQueue =dispatch_queue_create("com.xxxx",nil);

    dispatch_async(myQueue, ^{//也可用dispatch_asyns()

        NSLog(@"thread1");

    });

                注意:如果是在OS X 10.8或iOS 6以及之后版本中使用,Dispatch Queue将会由ARC自动管理。如果在此之前的版本,需要我们调dispatch_release(myQueue) 手动释放掉;
     (2)获取系统提供的Dispatch Queue。系统的串行队列,即Main Dispatch Queue(只有一个,一般只在需要更新UI我们才获取)

dispatch_queue_t myMainQueue =dispatch_get_main_queue();

    dispatch_async(myMainQueue, ^{//必须用dispatch_async,如果用dispatch_async会发生死锁,因为:

      1.主线程通过dispatch_sync把block交给主队列后,会等待block里的任务结束再往下走自身的任务,
  2.而队列是先进先出的,block里的任务也在等待主队列当中排在它之前的任务都执行完了再走自己。

        //多用来执行更新ui操作

    });

    或者使用以下方式:

    dispatch_async(dispatch_get_main_queue(), ^{//必须用dispatch_async

        //多用来执行更新ui操作

    });

2、Concurrent Dispatch Queue 并发的执行队列的任务,其执行顺序与其加入队列的顺序相同,一个相同的时间段内,可有多个线程运行(具        体多少个,有系统决定)。同样并发队列也有两种获得方式,即:
     (1)自己手动创建一个
       dispatch_queue_t myQueue = dispatch_queue_create("com.xxxx"DISPATCH_QUEUE_CONCURRENT);

     dispatch_sync(myQueue, ^{//也可用dispatch_asyns()

         NSLog(@"thread1");

     });

        (2)  获取系统提供的Dispatch Queue,根据优先级的不同,系统提供三种不同优先级的Concurrent Queues即:

  dispatch_queue_t aQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    dispatch_queue_t aHQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

    dispatch_queue_t aLQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);



 3、dispatch_async和dispatch_sync之间的区别

    (1)async:当当前线程给子线程分配了block当中的任务之后,当前线程会立即执行,并不会发生阻塞,也就是异步的,程序的运行结果是不                可预知的

      (2)sync:当主线程将任务分给子线程后,主线程会等待子线程执行完毕,再继续执行自身的内容


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值