关于GCD
文顶顶的博客(关于GCD)
相关的概念:
核心要区分同步异步和串行并行的区别
1.任务:即程序要做的事情(在GCD中即是block中要执行的操作)
2.队列:GCD中的基本操作单元(即为queue)
队列分为两种(队列的串行和并行是对于队列中的任务而言的)
a:串行队列:(队列中的任务会按顺序执行)
包括两种:1.普通的串行队列(dispatch_queue_crate("",null)方法获取)
2.主队列(dispatch_get_main_queue)(也是一种串行队列)
b:并行队列:(队列中的任务执行是并发的)
1.(dispatch_get_globle_queue(dispatch_queue_priority_default,0))获取并行队列。
3.同步和异步
这是对于线程而言的
同步:在当前线程执行队列
异步:开启新线程执行队列
4.执行效果
附:结果图片来源于文顶顶的博客
5.执行玩两个接口后才执行的回调
dispatch_group_t serviceGroup = dispatch_group_create();
// Start the first service
dispatch_group_enter(serviceGroup);
[self.configService startWithCompletion:^(ConfigResponse *results, NSError* error){
// Do something with the results
configError = error;
dispatch_group_leave(serviceGroup);
}];
// Start the second service
dispatch_group_enter(serviceGroup);
[self.preferenceService startWithCompletion:^(PreferenceResponse *results, NSError* error){
// Do something with the results
preferenceError = error;
dispatch_group_leave(serviceGroup);
}];
dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{
// Assess any errors
NSError *overallError = nil;
if (configError || preferenceError)
{
// Either make a new error or assign one of them to the overall error
overallError = configError ?: preferenceError;
}
// Now call the final completion block
completion(overallError);
});
6.如何让两个接口顺序执行
使用信号量的方式让接口顺序执行.dispatch_semaphore_t
内在逻辑可以类比停车场的车位.若停车场只有一个车位,则只有当第一辆车开走了第二辆车才能开进来.semaphore 的值就是空车位的数量.
blog.csdn.net/meegomeego/article/details/45192579
信号量的解释:
关于信号量,一般可以用停车来比喻。
停车场剩余4个车位,那么即使同时来了四辆车也能停的下。如果此时来了五辆车,那么就有一辆需要等待。
信号量的值就相当于剩余车位的数目,dispatch_semaphore_wait函数就相当于来了一辆车,dispatch_semaphore_signal
就相当于走了一辆车。停车位的剩余数目在初始化的时候就已经指明了(dispatch_semaphore_create(long value)),
调用一次dispatch_semaphore_signal,剩余的车位就增加一个;调用一次dispatch_semaphore_wait剩余车位就减少一个;
当剩余车位为0时,再来车(即调用dispatch_semaphore_wait)就只能等待。有可能同时有几辆车等待一个停车位。有些车主
没有耐心,给自己设定了一段等待时间,这段时间内等不到停车位就走了,如果等到了就开进去停车。而有些车主就像把车停在这,
所以就一直等下去。
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
for (int i=0; i<4; i++) {
dispatch_sync(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
if (i==0) {
[self loadDetailData]; //请求A
}else if (i==1){
[self loadHotCommentData]; //请求B
}else if (i==2){
[self loadOtherCommentData]; //请求C
}else if (i==3){
[self loadPhotoData]; //请求D
}
dispatch_semaphore_signal(semaphore);
});
}