您的位置:首页 > 移动开发 > IOS开发

GCD的理解

2016-05-12 17:19 323 查看
1.这篇介绍比较基础,简单明了
http://www.cnblogs.com/wendingding/p/3806821.html
2.这篇文章研究了GCD,着重讲了GCD的坑
http://www.cocoachina.com/ios/20150505/11751.html
同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

延迟执行任务
dispatch_after(
queue
);


第一个参数一般是DISPATCH_TIME_NOW,表示从现在开始。

那么第二个参数就是真正的延时的具体时间。

NSEC_PER_SEC,每秒有多少纳秒。

USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)

NSEC_PER_USEC,每毫秒有多少纳秒。

例子:

//挂起队列
dispatch_suspend(queue);


“同步”的dispatch_apply

dispatch_apply的作用是在一个队列(串行或并行)上“运行”多次block,其实就是简化了用循环去向队列依次添加block任务。

dispatch_apply 会“等待”其所有的循环运行完毕才往下执行;嵌套使用容易导致死锁

//异步添加任务

dispatch_group_enter(group);


//异步结束任务


dispatch_group_leave(group);








//----------------------------

同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
 

并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务

使用dispatch_queue_create函数创建串行队列dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);//
串行队列
DISPATCH_QUEUE_SERIAL
并行队列
DISPATCH_QUEUE_CONCURRENT

主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

使用dispatch_get_main_queue()获得主队列

使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);
说明:全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

一些说明

dispatch_once_t只有一份实例。

+(SchoolManager *)sharedInstance  
{  
    static SchoolManager *sharedManager;  
      
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedManager = [[SchoolManager alloc] init];  
    });  
      
    return sharedManager;  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS gcd