关于GCD

2016-05-11  本文已影响23人  lixiaoshuai

文顶顶的博客(关于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);

});

}

上一篇下一篇

猜你喜欢

热点阅读