前言
方法以及作用:当我们在编辑项目时遇到网络请求或者开启子线程执行时,线程和请求之外的逻辑需要等待它执行完才可以执行,这时用dispatch_semaphore_t可以满足需求。
dispatch_semaphore_t 用法
//创建信号
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//发射信号
dispatch_semaphore_signal(sema);
//等待信号
dispatch_semaphore_wait(sema, 1.0);
使用信号量 dispatch_semaphore_t 控制请求
- (NSArray *)p_upData{
//存放数据
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//替代我们平时常用的异步网络请求
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i=0; i<10; i++) {
[array addObject:[NSNumber numberWithInt:i]];
}
NSLog(@"array = %@",array);
});
return array;
}
输出下上面的方法
NSArray * dataArray = [self p_upData];
NSLog(@"dataArray = %@",dataArray);
2018-04-17 10:30:45.868 HTMITest dataArray = (
)
2018-04-17 10:30:45.875 HTMITest array = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
想要的结果没有输出,但是查看这个数组他肯定有值。
- 现在我们把上述方法修改下,使用信号量控制,再来看看结果
- (NSArray *)p_upData{
//修改下面的代码,使用信号量来进行一个同步数据
//我们传入一个参数0 ,表示没有资源,非0 表示是有资源,这一点需要搞清楚
//这里的整形参数如果是非0 就是总资源
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
//假如下面这个数组是用来存放数据的
NSMutableArray * array = [NSMutableArray arrayWithCapacity:0];
//下面这个来代替我们平时常用的异步网络请求
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i=0; i<10; i++) {
[array addObject:[NSNumber numberWithInt:i]];
}
NSLog(@"array = %@",array);
dispatch_semaphore_signal(sema);
});
//信号等待 时,资源数 -1 阻塞当前线程
dispatch_semaphore_wait(sema, 1.0);
return array;
}
- 信号量的理解:
我们初始化的时候会先设置一个信号总量,如果信号总量的整形参数是0 ,那么就是没有资源需要等待,我们如果下面执行wait 操作,那么相当于线程拥堵,执行信号-1 操作
- 再次看下控制台的输出:
2018-04-17 10:36:17.361 HTMITest array = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
2018-04-17 10:36:17.364 HTMITest resultArrsy = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
)
网友评论