关于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

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