说说我对 GCD dispatch_semaphore_t

接触了好久的CGD只会简单的使用 异步线程和使用的时候确实挺方便的,但是一直没有时间深入的学习,这段时间偶然看到一个项目中有下面的那段代码


    __block BOOL accessGranted = NO;
    __block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    }];
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);
    static BOOL bFinish = YES;
    if (accessGranted) {
         bFinish = NO;
        //执行一些代码
        bFinish = YES;
    }

这些是什么意思呢?瞬间感觉高大上的代码有木有,怎么都感觉自己不会理解呢,

原来GCD用来处理并发线程的代码,也就是当线程量达到一个数量的的时候用来控制并发的数量

信号量是一个整形的并有一个初始值,支持信号通知和等待,当一个信号量被信号通知,他的计数就会加1,当一个线程在一个信号量上等待的时候

线程就有可能会被阻塞,直到计数器大于零,线程就会减少这个计数.

dispatch_samaphore 提供的一下的四个函数进行操作

<pre name="code" class="objc">        dispatch_semaphore_create(long value); //创建信号
        dispatch_semaphore_signal(dispatch_semaphore_t dsema); //发送信号
        dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); //等待信号
        dispatch_release(dispatch_object_t object)//信号释放
 
 

    dispatch_semaphore_t sema =dispatch_semaphore_create(0);

    dispatch_semaphore_signal(sema);

    dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);

    dispatch_release(sema)//在ARC模式下很少使用这个方法


例子

    dispatch_queue_t queue = dispatch_queue_create("MyqueueBlock", NULL);\
    dispatch_async(queue, ^{
        int sum = 0;
        for (int i = 0 ; i<5; i++)
        {
            sum += data;
            NSLog(@"Sum1 = %d",sum);
        }
    });
    for (int i= 0 ; i < 5; i++)
    {
        maindata++;
        NSLog(@"Maindata = %d",maindata);
        
    }

运行结果如下

2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82049] Maindata = 1

2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 3

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 6

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 2

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 9

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 3

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 12

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 4

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 15

2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 5


把代码改成下面代码 把dispatch_semaphorer_t的代码给加上运行结果如下

</pre><pre name="code" class="objc">    dispatch_queue_t queue = dispatch_queue_create("MyqueueBlock", NULL);\
    dispatch_async(queue, ^{
        int sum = 0;
        for (int i = 0 ; i<5; i++)
        {
            sum += data;
            NSLog(@"Sum1 = %d",sum);
        }
        long semal = dispatch_semaphore_signal(sema);//发一信号出来
    });
    long semal2 =  dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    for (int i= 0 ; i < 5; i++)
    {
        maindata++;
        NSLog(@"Maindata = %d",maindata);
        
    }


运行结果如下:

2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 3

2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 6

2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 9

2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 12

2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 15

2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 1

2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 2

2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 3

2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 4

2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 5

上面两个列子可以看出dispatch_async 虽然是异步操作,但是加上dispatch_semaphore_t之后就会等待dispatch_semaphore_t线程执行后再执行后面的代码

1.dispatch_semaphore_create(long value);创建信号

value ,当前并发执行的线程量

2.dispatch_semaphore_signal(dispatch_semaphore_t dsema);

发送一个信号出来,dsema的信号量加1

3.dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); 

dsema的信号量减1,dispatch_time_t的值有DISPATCH_TIME_NOW表示当前,DISPATCH_TIME_FOREVER表示遥远的未来

(a).dsema 的信号量大于0的时候就执行该函数下面的代码,并将信号量减1, 

(b).dsema的信号量等于0 的时候函数就阻塞在当期的线程等待timeout时间再运行下面的代码,或等到接受到dispatch_semaphore_signal(dsema)发送的信号

(c).dispatch_time_t 的定义  t = dispatch_time(DISPATCH_TIME_NOW, 1*1000*1000*1000);

            







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值