(先介绍信号量的应用,最后再介绍信号量类的代码实现)
1. 信号量的使用情况:
一个控制器页面并发多个网络请求,页面的展示需要多个网络请求后的数据(超过一个网络接口请求)
2. 信号量使用的目的:
等待所有网络请求完成后,页面再展示所有数据。
3. 信号量如何使用:
3.1 创建私有信号量属性
@property (nonatomic,strong) GCDSemaphore *semaphore;
3.2 初始化信号量 (一般在第一个网络请求方法里初始化)
self.semaphore = [GCDSemaphore new];
3.3在子线程中信号量等待(有几个网络请求就调用几次等待方法,比如两个)
[weakSelf.semaphore wait];
[weakSelf.semaphore wait];
3.4 在网络请求完成后的成功和失败方法里发送信号量信号
[self.semaphore signal];
3.5 信号全发完后在主线程中代码,销毁信号量 ,停止请求菊花,处理数据并展示到页面上
weakSelf.semaphore =nil;
[weakSelf.showLoadingView stopLoading];
4. 信号量工具类代码如下
4.1 .h代码
@interface GCDSemaphore : NSObject
@property (strong, readonly, nonatomic) dispatch_semaphore_t dispatchSemaphore;
#pragma 初始化
- (instancetype)init;
- (instancetype)initWithValue:(long)value;
#pragma mark - 用法
- (BOOL)signal;
- (void)wait;
- (BOOL)wait:(int64_t)delta;
4.2 .m代码
#import "GCDSemaphore.h"
@interface GCDSemaphore ()
@property (strong, readwrite, nonatomic) dispatch_semaphore_t dispatchSemaphore;
@end
@implementation GCDSemaphore
- (instancetype)init {
self = [super init];
if (self) {
self.dispatchSemaphore = dispatch_semaphore_create(0);
}
return self;
}
- (instancetype)initWithValue:(long)value {
self = [super init];
if (self) {
self.dispatchSemaphore = dispatch_semaphore_create(value);
}
return self;
}
- (BOOL)signal {
return dispatch_semaphore_signal(self.dispatchSemaphore) != 0;
}
- (void)wait {
dispatch_semaphore_wait(self.dispatchSemaphore, DISPATCH_TIME_FOREVER);
}
- (BOOL)wait:(int64_t)delta {
return dispatch_semaphore_wait(self.dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW, delta)) == 0;
}
5. 代码的使用上,第3步也给了相应展示,最后给个使用代码(参考上面3步)截图