好东西小知识点程序员

信号量(dispatch_semaphore_t)- 实现一个页

2017-08-11  本文已影响169人  icc_tips

目标:实现一个页面多个请求

我们经常遇到这样的情况:例如用户界面的数据展示 里面有多个接口,我们数据请求完成之后展示页面。这时应该怎么办?或者里面的接口一层套一层(比如需要获取用户基本接口的数据,才能获取用户的其他信息)这时我们又该怎么办?基于这样的目的,我们使用来了信号量

信号量(dispatch_semaphore_t)的介绍(谷歌而来,大家也可以去看看,自己也不是很懂)

信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。 一般情况是这样进行临界访问或互斥访问的: 设信号量值为1, 当一个进程1运行是,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这是信号量值为0。系统中规定当信号量值为0是,必须等待,知道信号量值不为零才能继续操作。 这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就到到了进程1排他访问。 当进程1运行结束后,释放资源,进行V操作。资源数重新加1,这是信号量的值变为1. 这时进程2发现资源数不为0,信号量能进行P操作了,立即执行P操作。信号量值又变为0.次数进程2咱有资源,排他访问资源。 这就是信号量来控制互斥的原理

主要就是这三个函数: 
dispatch_semaphore_create 创建一个semaphore 
dispatch_semaphore_signal 发送一个信号(自然会让信号总量加1)
dispatch_semaphore_wait 等待信号(当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1)

实现目标

1:采用GCD方法

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self loadUserData];
}) ;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self loadBalaceData];
}) ;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self loadUserFriendsData];
}) ;
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//展示页面
[self showUserView];
});

-(void)request2{
//创建信号量并设置计数默认为0
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSDictionary * para ;//参数 具体部分我就不暴露了
[WJFCollection postWithUrlString:@"url" Parameter:para success:^(id responseObject) {
//只要在这里发送信号
dispatch_semaphore_signal(semaphore);
} failure:^(NSError *error) {
//只要在这里发送信号
dispatch_semaphore_signal(semaphore);
NSLog(@"%@",error);
}];
//若计数为0则一直等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}

2:采用NSOperationQueue方法

NSBlockOperation *operation_1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1");
[self loadUserFriendsData];
}];
NSBlockOperation *operation_2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2");
[self loadBalaceData];
}];
NSBlockOperation *operation_3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3");
[self loadUserData];
}];
//设置依赖关系
[operation_2 addDependency:operation_3];
[operation_1 addDependency:operation_2];
//创建队列并添加任务 (这里要设置No)
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperations:@[operation_3,operation_2,operation_1] waitUntilFinished:NO];
//注意这里一定要是No,不然会阻塞线程

参考的文章:

http://www.jianshu.com/p/04ca5470f212

上一篇下一篇

猜你喜欢

热点阅读