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一对一直播系统源码开发,多弹窗顺序弹出的实现”的全部内容了,希望对大家有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值