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

iOS 多线程之GCD使用

2015-10-16 11:45 357 查看
GCD全称:Grand
Central Dispatch,是Apple开发的一套底层多核编程的API,它主要用于优化应用程序以支持多核处理器,它是一个在线程池模式的基础上执行的并行任务。GCD可以让我们不用直接和线程打交道,而是通过把任务分配给dispatch
queues(调度队列),然后让这些queues去执行task(任务)

一、定义队列
1.串行队列:dispatch_get_main_queue()

例:dispatch_queue_t mainQueue = dispatch_get_main_queue();
//串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)
//多用于处理UI

 2.并行队列:dispatch_get_global_queue(优先级,扩展)

/*
  参数1:优先级   High、Default、Low、Background。
  参数2:预保留参数,暂时不明其作用。写“0”
 */

例:dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//并行队列,任务同时执行,多用于处理数据

3.用户队列(自定义队列):dispatch_queue_create(队列标签, 串行/并行)

/*
  参数1:标签(标识符)要保证其为全局唯一,Apple官方就推荐使用反DNS的格式来命名,这纯是为了debug,这些名字会在崩溃日志中被显示出来,也可以被调试器调用,这在调试中会很有用
  参数2:(DISPATCH_QUEUE_CONCURRENT)并行/(DISPATCH_QUEUE_SERIAL)串行
*/

例:dispatch_queue_tmyQueue
= dispatch_queue_create("com.test.myQueueTag",DISPATCH_QUEUE_CONCURRENT);
//使用DISPATCH_QUEUE_CONCURRENT 就相当于是dispatch_get_global_queue   串行也同理

4.成组队列:dispatch_group_t group
= dispatch_group_create();
用法:多用于并行队列,多任务时
//在dispatch_queue中当所有的任务执行完成后想做其他操作
//在串行队列中(一般不需要用到group),可以把该操作放到最后一个任务执行完成后继续

//并行队列中,就用group的notify, dispatch_notify()是group结束的点
示例代码:
{
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"A"];
});
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"B"];
});
dispatch_group_notify(group,globalQueue, ^{
[selfdosomething:@"我最后执行"];
});
dispatch_group_async(group, globalQueue, ^{
[self dosomething:@"C"];
});
}//A,B,C并行执行,最后再执行notify

二、异步调度和同步调度(提交任务)

1.异步调度
dispatch_async : dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
 
//把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态(立即执行)

示例代码:
模板:
dispatch_async(globalQueue, ^{
//请求数据(分线程)

dispatch_async(mainQueue, ^{
//UI操作(主线程)

});
});
2.同步调度 dispatch_sync : dispatch_sync(<#dispatch_queue_t
queue#>, <#^(void)block#>)

//把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.(等前面的任务执行完)

三、GCD的更多用法

1.dispatch_once(整个工程只调用一次(可用于单例))
例:
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只调用一次");
});
}
2.dispatch_apply(重复调用,调用多次)
dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)

例:
{
dispatch_apply(4,globalQueue, ^(size_t t) {
NSLog(@"%ld",t);
});
}


3.dispatch_after(延迟操作)
例:
dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
{
doubledelayInSeconds =2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"2秒后执行");
});
}
4.dispatch_barrier_async(并行队列中,可充当分割线)
例:
{
dispatch_queue_t myQueue =dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue, ^{
[selfdosomething:@"A"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"B"];
});

//分割
dispatch_barrier_async(myQueue, ^{
[selfdosomething:@"C"];
});

dispatch_async(myQueue, ^{
[selfdosomething:@"D"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"E"];
});
}

//A,B并行执行 然后执行C,再并行执行D,E
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcd 多线程 iOS 开发 线程