您的位置:首页 > 其它

说说我对 GCD dispatch_semaphore_t

2015-10-31 21:16 399 查看
接触了好久的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);

            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: