zoukankan      html  css  js  c++  java
  • iOS一对一直播系统源码开发,多弹窗顺序弹出的实现

    前言
    弹窗在交互上是个好东西,但是如果一个view有很多弹窗且产品要求按照一定的顺序弹出,emmm…很好,就很棒!在一对一直播系统源码开发过程中,也会遇到这种类似的情况,所以接下来我们一起来看看实现的方法。

    先上需求
    目前有三个弹窗A、B、C,现在弹窗要按照A -> B -> C这个顺序来,每次只能弹一个,三个都是网络请求,不知道哪个结果先回来。分析一下,有如下场景:

    • 理想型

    数据顺序返回,顺序展示。期间通过一对一直播系统源码的弹窗可跳转其他页面,返回后继续顺序展示。

    • 进阶型

    B数据先回,B显示ing时,A、C数据返回,缓存数据。不管谁数据先回来,B消失后都从A开始展示。期间通过一对一直播系统源码弹窗跳转其他页面,返回后继续顺序展示。

    • 高端型

    A先回来,B是定时任务。通过A跳转到其他页面后B数据回来,正常情况下, 返回后会弹B。特别的,在一对一直播系统源码其他页面某项操作后,B不用弹了,返回后B不弹。

    正题

    简单分析一下:

    • 1、在一对一直播系统源码中标识一个弹窗要有三元素:弹窗类型、弹窗状态(参考线程生命周期)、弹窗展示用的数据。

      所以创建以下任务类: .h

    typedef NS_ENUM(NSInteger, MQRoomAlertTaskType) {
        MQRoomAlertTaskType_Runnable = 0,       //就绪
        MQRoomAlertTaskType_Running,            //执行中
        MQRoomAlertTaskType_end,                //完成
        
    };
    
    typedef NS_ENUM(NSInteger, MQRoomAlertType) {
        MQRoomAlertType_HongBao = 0,        //红包
        MQRoomAlertType_GrowGift,           //成长礼包
        MQRoomAlertType_Addention,          //关注
    };
    
    
    @interface MQRoomAlertOrderTask : NSObject
    
    /** 弹窗种类 */
    @property (nonatomic, assign) MQRoomAlertType alertType;
    @property (nonatomic, strong) id taskData;
    /** 任务状态 */
    @property (nonatomic, assign) MQRoomAlertTaskType taskType;
    
    
    @end
    
    • 2、 顺序展示,简单点用数组。有一对一直播系统源码跨页面操作,用单例。创建以下管理类: .h
    @interface MQRoomAlertOrderManager : NSObject
    
    + (instancetype)shareInstance;
    
    //当前可执行任务
    @property (nonatomic, strong, readonly, nullable) MQRoomAlertOrderTask *curTask;
    /** 是否正在执行 */
    @property (nonatomic, assign, readonly) BOOL isExecuting;
    
    /** 缓存 */
    - (void)setTasKWithData:(id)data taskType:(MQRoomAlertType)alertType;
    /** 执行 */
    - (void)execute;
    /** 是否正在执行 */
    - (BOOL)executing;
    /** 完成 */
    - (void)complete;
    /** 清空 */
    - (void)clear;
    /** 根据任务类型获取任务 */
    - (MQRoomAlertOrderTask *)getTaskWithAlertType:(MQRoomAlertType)alertType;
    
    /** 销毁单例 */
    - (void)destroy;
    
    @end
    
    • 3、使用的时候采用递归方式
      核心代码
    - (void)orderAlert {
        MQRoomAlertOrderManager *manager = [MQRoomAlertOrderManager shareInstance];
        if (manager.isExecuting) {//正在执行任务,既有弹窗在显示
            return;
        }
        if (manager.curTask) {
            switch (manager.curTask.alertType) {
                case MQRoomAlertType_HongBao: {
                    NSLog(@">>>>>>MQRoomAlertType_HongBao");
                    //标记执行
                    [manager execute];
                    dispatch_async(self.queue, ^{
                        //模拟弹窗时间
                        sleep(arc4random() % 5 + 1);
                        //取当前任务数据
    //                    id data = [MQRoomAlertOrderManager shareInstance].curTask.taskData;
                        [self nextAlert];
                    });
                    break;
                }case MQRoomAlertType_GrowGift: {
                    NSLog(@">>>>>>MQRoomAlertType_GrowGift");
                    //标记执行
                    [manager execute];
                    dispatch_async(self.queue, ^{
                        //模拟弹窗时间
                        sleep(arc4random() % 5 + 1);
                        //取当前任务数据
    //                    id data = [MQRoomAlertOrderManager shareInstance].curTask.taskData;
                        [self nextAlert];
                    });
                    break;
                }case MQRoomAlertType_Addention: {
                    NSLog(@">>>>>>MQRoomAlertType_Addention");
                    //标记执行
                    [manager execute];
                    dispatch_async(self.queue, ^{
                        //模拟弹窗时间
                        sleep(arc4random() % 5 + 1);
                        //取当前任务数据
    //                    id data = [MQRoomAlertOrderManager shareInstance].curTask.taskData;
                        [self nextAlert];
                    });
                    break;
                }
                default:
                    break;
            }
        }else {
            self.hadTask = NO;
            NSLog(@">>>all task completed");
        }
    }
    
    - (void)nextAlert {
        //当前任务完成
        [[MQRoomAlertOrderManager shareInstance] complete];
        //递归执行下一任务
        [self orderAlert];
    }
    

    该管理类只是用来缓存弹窗数据、标记弹窗状态,不要把一对一直播系统源码业务逻辑代码写到这里面来。

    注意

    若是那种跳转到其它页面后,改变某个任务的状态,这时候只需要获取对应task,然后把taskType设置为MQRoomAlertTaskType_end就可以了。

    //根据类型获取某一任务
    MQRoomAlertOrderTask *task = [[MQRoomAlertOrderManager shareInstance] getTaskWithAlertType:MQRoomAlertType_GrowGift];
    //改变任务状态
    task.taskType = MQRoomAlertTaskType_end;
    

    以上就是“iOS一对一直播系统源码开发,多弹窗顺序弹出的实现”的全部内容了,希望对大家有帮助。

    本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理
    原文链接:https://www.jianshu.com/p/b22f34b582ee

  • 相关阅读:
    【Oracle】优化器之RBO与CBO
    【Oracle11g】16_数据字典和动态性能视图
    AXI总线介绍
    Verilog 加法器和减法器(8)-串行加法器
    状态机实例-寄存器拷贝
    状态机状态最小化
    vcs+Makefile实现简单的testbench
    quartus II输入原理图及仿真步骤
    Directx11代码下载
    触发器的时序参数与时序分析
  • 原文地址:https://www.cnblogs.com/yunbao/p/14982054.html
Copyright © 2011-2022 走看看