GitHub 有興趣給個(gè)小????
需求:app啟動(dòng)的時(shí)候總是會(huì)顯示許許多多的彈窗,那么有一個(gè)需求就是讓這種彈窗 一個(gè)個(gè)的顯示咨演,點(diǎn)掉一個(gè)顯示下一個(gè)。碰到這樣的需求該如何搞定呢蚯斯。 --- 信號(hào)量
信號(hào)量
這個(gè)相信大家都比較熟悉薄风,這里我簡(jiǎn)單的講述一下我的理解。理解思路拍嵌,代碼就比較Easy了遭赂。
舉例:比如有一個(gè)大廳,能容納N個(gè)人横辆,那么如果小于N個(gè)人的時(shí)候 順便進(jìn)入撇他,如果大于N個(gè)人那么就是必須要有人出去才能有新的人進(jìn)來。
彈窗:如果大廳只能容納一個(gè)彈窗狈蚤,那么是不是要一個(gè)彈窗“出去”困肩,才能有新的彈窗“進(jìn)來”。
實(shí)現(xiàn)
創(chuàng)建一個(gè)BaseAlertView脆侮,所有的彈窗繼承于它锌畸,自定義。
@implementation BaseAlertView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:[UIScreen mainScreen].bounds];
if (self)
{
}
return self;
}
#pragma mark - public
- (void)show
{
[[[UIApplication sharedApplication] keyWindow] addSubview:self];
}
- (void)dismiss
{
[self removeFromSuperview];
}
@end
那么怎么給BaseAlertView 添加信號(hào)量呢靖避?潭枣?
思路:
- 創(chuàng)建全局只容納1個(gè)單位的信號(hào)量
- Show的時(shí)候 Lock
- Dismiss的時(shí)候 Release Lock
注意看注釋
//全局信號(hào)量
dispatch_semaphore_t _globalInstancesLock;
//執(zhí)行QUEUE的Name
char *QUEUE_NAME = "com.alert.queue";
//初始化 -- 借鑒YYWebImage的寫法
static void _AlertViewInitGlobal() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_globalInstancesLock = dispatch_semaphore_create(1);
});
}
@implementation BaseAlertView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:[UIScreen mainScreen].bounds];
if (self)
{
_AlertViewInitGlobal();
}
return self;
}
#pragma mark - public
- (void)show
{
//位于非主線程 不阻塞
dispatch_async(dispatch_queue_create(QUEUE_NAME, DISPATCH_QUEUE_SERIAL), ^{
//Lock
dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER);
//保證主線程UI操作
dispatch_async(dispatch_get_main_queue(), ^{
[[[UIApplication sharedApplication] keyWindow] addSubview:self];
});
});
}
- (void)dismiss
{
dispatch_async(dispatch_queue_create(QUEUE_NAME, DISPATCH_QUEUE_SERIAL), ^{
//Release Lock
dispatch_semaphore_signal(_globalInstancesLock);
dispatch_async(dispatch_get_main_queue(), ^{
[self removeFromSuperview];
});
});
}
是不是很簡(jiǎn)單,如果有更好的辦法也歡迎討論幻捏。