美文网首页iOS 进阶iOS-Developer-OC
iOS 弹窗顺序显示 -- 信号量实践

iOS 弹窗顺序显示 -- 信号量实践

作者: David_Cap | 来源:发表于2018-10-08 15:45 被阅读127次

GitHub 有兴趣给个小🌟🌟
需求:app启动的时候总是会显示许许多多的弹窗,那么有一个需求就是让这种弹窗 一个个的显示,点掉一个显示下一个。碰到这样的需求该如何搞定呢。 --- 信号量

信号量

这个相信大家都比较熟悉,这里我简单的讲述一下我的理解。理解思路,代码就比较Easy了。

举例:比如有一个大厅,能容纳N个人,那么如果小于N个人的时候 顺便进入,如果大于N个人那么就是必须要有人出去才能有新的人进来。

弹窗:如果大厅只能容纳一个弹窗,那么是不是要一个弹窗“出去”,才能有新的弹窗“进来”。

实现

创建一个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 添加信号量呢??

思路:

  1. 创建全局只容纳1个单位的信号量
  2. Show的时候 Lock
  3. Dismiss的时候 Release Lock

注意看注释

//全局信号量
dispatch_semaphore_t _globalInstancesLock;
//执行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];
        });
    });
}

是不是很简单,如果有更好的办法也欢迎讨论。

相关文章

  • iOS 弹窗顺序显示 -- 信号量实践

    GitHub 有兴趣给个小??需求:app启动的时候总是会显示许许多多的弹窗,那么有一个需求就是让这种弹窗 一个个...

  • iOS开发弹窗顺序显示

    需求:app启动的时候总是会显示许许多多的弹窗,那么有一个需求就是让这种弹窗一个个的显示,点掉一个显示下一个。碰到...

  • iOS 弹窗顺序显示的实现之路

    当产品搞了一堆弹窗的需要后,如各自提示、引导,然后发现这样不好,需要进行排序显示,也就是显示一个之后再显示下一个,...

  • iOS 11在window上加视图不显示

    项目中用到了弹窗类***,发现iOS 8.1正常,iOS 11弹窗不显示,想到估计是window的问题,查了一下,...

  • iOS 11 定位权限弹窗不显示

    iOS 11 定位权限弹窗不显示-官方链接 百度SDK 升级之后,定位权限弹窗不显示,原因是苹果要求调用请求。 r...

  • iOS 多弹窗顺序弹出

    明日安在,无人能允。 前言 弹出在交互上是个好东西,但是如果一个view有很多弹窗且产品要求按照一定的顺序弹出,e...

  • Android 禁止重复弹出多个对话框

    是不是为弹窗顺序而烦恼,导致写太多弹窗顺序逻辑,有了它妈妈再也不用担心复杂的弹窗顺序逻辑问题了 哥们点个赞再走呀 ...

  • IOS 收集的文章2

    iOS13如何适配暗黑模式 iOS 通过添加线程依赖和信号量结合实现一个复杂界面请求多个接口时按指定顺序执行 iO...

  • 实现 iOS 前台时的推送弹窗效果

    实现 iOS 前台时的推送弹窗效果 实现 iOS 前台时的推送弹窗效果

  • 实现 iOS 前台时的推送弹窗效果

    实现 iOS 前台时的推送弹窗效果 实现 iOS 前台时的推送弹窗效果

网友评论

本文标题:iOS 弹窗顺序显示 -- 信号量实践

本文链接:https://www.haomeiwen.com/subject/apljaftx.html