关于GCD

作者: lixiaoshuai | 来源:发表于2016-05-11 18:30 被阅读23次

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

});

}

相关文章

  • GCD基础篇 - 同步、异步,并发、并行的理解

    1、关于GCD - GCD全称是Grand Central Dispatch -GCD是苹果公司为多核的并行...

  • iOS多线程,GCD的了解及实现

    什么是GCD,关于GCD的简单概念 其实多线程这个东西,GCD(Grand Central Dispatch),纯...

  • GCD的使用-让面试简单点

    关于GCD: GCD全称Grand Central Dispatch GCD是苹果公司为多核的并行运算提...

  • NSOperation与网络封装(上)

    关于NSOperation 基于GCD,NSOperation是一个基于GCD封装的类。 Command,通过NS...

  • 关于gcd

    这几天有点时间,就把gcd研究了一下。现把心得和笔记记录如下 gcd常用的api,dispatch_queue_c...

  • 关于GCD

    笔者也是在边学习边整理,有不对的地方欢迎指出 GCD的两种类型:(1)并发队列(Concurrent Dispat...

  • 关于GCD

    文顶顶的博客(关于GCD) 相关的概念: 核心要区分同步异步和串行并行的区别 1.任务:即程序要做的事情(在GCD...

  • Swift3使用GCD和DispatchQueues关于gcd

    关于对gcd 的使用,有几个链接写的还是相当不错的。Swift3使用GCD和DispatchQueueshttp:...

  • iOS GCD的使用

    关于GCD(Grand Central Dispatch): 苹果官方对GCD是这样说明的:开发者要做的只是定义想...

  • GCD整理(一)

    整理一篇关于GCD的文章,自己以后要复习的时候也方便。 GCD(Grand Center Dispatch)异步执...

网友评论

      本文标题:关于GCD

      本文链接:https://www.haomeiwen.com/subject/ozkurttx.html