这篇GCD写的也不错 http://blog.csdn.net/wildfireli/article/details/18668897
一.简单封装的GCD方法
//在主线程中执行
+ (void)executeTaskInMainThread: (void (^)())block
{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, block);
}
//在子线程中执行
+ (void)executeTaskInChildThread: (void (^)())block
{
dispatch_queue_t asynQueue = dispatch_queue_create("", NULL);
dispatch_async(asynQueue, block);
}
//在子线程中执行
+ (void)executeTaskInSubThread: (void (^)())block
{
dispatch_queue_t asynQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(asynQueue, block);
}
二: 通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// long-running task
dispatch_async(dispatch_get_main_queue(), ^{
// update UI
});
});
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:
dispatch_queue_t queue = dispatch_queue_create("testqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_async(queue, ^{
NSLog(@"dispatch_barrier_async");
});
五、dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:
1. 创建一个group
dispatch_group_t group =dispatch_group_create();
2.发送三个请求
[self requestDistance:group];
[selfequestGoodlist:group];
[selfequestMenu:group];
3. 为group设置通知一个block,当group关联的block执行完毕后,就调用这个block。类似dispatch_barrier_async。 dispatch_group_notify(group, queue, ^{
//做一些执行完毕的操作
});
或者,等 三个请求都执行完毕后,来刷新界面的数据
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//在主线程中刷新界面数据
});
4. 手动管理group关联的block的运行状态(或计数),进入和退出group次数必须匹配
dispatch_group_enter (group);//进入
dispatch_group_leave (group);//退出
dispatch_group_enter(group); //进入
[TFRequestInterfaceselectPartyInfo:_partyID sucess:^(Info *userInfo) {
dispatch_group_leave(group);//退出
} failure:^(NSError *error) {
}];
六、dispatch_apply
执行某个代码片段N次。
dispatch_apply(5, globalQ, ^(size_t index) {
// 执行5次
});
七、dispatch_after
有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用dispatch_after这个函数:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
八 、dispatch_once
dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!
+ (TFTTSSpeakManager *)sharedInstance
{
static dispatch_once_t onceToken;
static TFTTSSpeakManager * sSharedInstance;
dispatch_once(&onceToken, ^{
sSharedInstance = [[TFTTSSpeakManager alloc] init];
});
return sSharedInstance;
}