信号量实现异步线程的同步操作,开发过程中需要几个异步的操作都完成之后再执行下一个操作,信号量是比较好的选择,它是线程阻塞的.比如等所有的数据都准备完成之后再展示画面,在请求的过程中展示loading.
敲黑板,先来介绍一下dispatch_semaphore_t的几个函数.
dispatch_semaphore_t sem = dispatch_semaphore_create(0); 创建信号量.
dispatch_semaphore_signal(sem); 信号量+1
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); 信号量-1
遇到dispatch_semaphore_wait如果信号量的值小于0,就一直阻塞线程,不执行后面的所有程序,直到信号量大于等于0;
//创建信号量 初始值为0
long semNum = 0;
dispatch_semaphore_t sem = dispatch_semaphore_create(semNum);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:downUrl]];
if (data) {
//遇到single 信号量 加1 信号量值为 0 ,线程阻塞解除
dispatch_semaphore_signal(sem);
}
});
//等待 遇到waint 减1,信号量的值为-1,一直等待
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
//等待完成
}
网友评论