<iOS>iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
介绍:
Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化应用程序支持多核处理器和其他的对称多处理系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X10.6,iOS4及以上也可用。
设计:
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排它们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
dispatch queue分为下面三种:
Serial
又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
Concurrent
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main dispatch queue
它是全局可用的serial queue,它使在应用程序主线程上执行任务的。介绍下diapatch queue如何使用


1、常用的方法dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据、IO、数据库读写等,会在另外一个线程中处理这些操作,然后通知主线程更新界面。
用GCD实现这个流程的操作比前面介绍的NSThread NSOperation的方法都要简单。代码框架结构如下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
    //耗时操作
    dispatch_async(dispatch_get_main_queue(),^{
    //更新界面
    });
});
这样写,代码比NSThread NSOperation简洁很多,而且GCD会自动根据任务在多核处理器上分配资源,优化程序。
系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,不需要去创建。只需要通过使用函数dispatch_get_global_queue去得到队列,如下:
dispatch_queue_t  globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
这里也用到了系统默认就有一个串行队列main_queue
dispatch_queue_t mainQ = dispatch_get_main_queue();
虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或release。


2、dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行了三个下载任务,当三个任务都下载完成后你才通知界面任务完成了。举例:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@“group1”);
});
dispatch_group_async(group,queue,^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@“group2”);
});
dispatch_group_async(group,queue,^{
    [NSThread sleepForTimeInterval:3];
    NSLog(@“group3”);
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
    NSLog(@“updateUI”);
});
dispatch_release(group);
dispatch_group_async是异步的方法,运行后可以看到打印结果顺序:
group1
group2
group3
updateUI

每个1秒打印一个,当第3个任务执行后,updateUI被打印。


3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会被执行。举例:
dispatch_queue_t queue = dispatch_queue_create(“shenzhen.zzt.yc", DISPATCH_QUEUE_CONCURRENT);  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:2];  
   NSLog(@"dispatch_async1");  
});  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:4];  
   NSLog(@"dispatch_async2");  
});  
dispatch_barrier_async(queue, ^{  
   NSLog(@"dispatch_barrier_async");  
   [NSThread sleepForTimeInterval:4];    
});  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:1];  
   NSLog(@"dispatch_async3");  
});  
打印结果顺序是:
dispatch_async1
dispatch_async2
dispatch_barrier_async
dispatch_async3



4、dispatch_apply
执行某个代码片段N次。
dispatch_apply(5,globalQ,^(size_t index){
    //执行5次
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值