前言
弹窗在交互上是个好东西,但是如果一个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