lixiang1994 / LEEAlert

优雅的可自定义 Alert ActionSheet
MIT License
1.3k stars 204 forks source link

关于队列继续属性的理解不是很清楚 #141

Open szmichaelyb opened 3 years ago

szmichaelyb commented 3 years ago

关于队列继续属性的理解不是很清楚

大佬,想知道队列继续属性(LeeContinueQueueDisplay)的设置,是针对当前即将要弹的弹框吗? 如果,我想要弹当前弹框之前,先暂停队列,然后等当前弹窗要执行的某些任务执行完毕后,再继续队列。

有没有全局设置的办法?

目前只看到 :

/** 继续队列显示 */
+ (void)continueQueueDisplay;

没看到全局设置暂停队列的方法,能不能全局加一个:

/** 暂停队列显示 */
+ (void)suspendQueueDisplay;
lixiang1994 commented 3 years ago

暂停可以对每个alert进行设置

lixiang1994 commented 3 years ago

有三个队列相关的设置

/** 设置 是否加入到队列 -> 格式: .LeeQueue(YES) */
@property (nonatomic , copy , readonly ) LEEConfigToBool LeeQueue;

/** 设置 优先级 -> 格式: .LeePriority(1000) */
@property (nonatomic , copy , readonly ) LEEConfigToInteger LeePriority;

/** 设置 是否继续队列显示 -> 格式: .LeeContinueQueue(YES) */
@property (nonatomic , copy , readonly ) LEEConfigToBool LeeContinueQueueDisplay;
lixiang1994 commented 3 years ago

使用LeeContinueQueueDisplay设置暂停的效果

lixiang1994 commented 3 years ago

当该Alert/ActionSheet关闭后 继续显示队列中的其他弹窗

.LeeContinueQueue(YES)

当该Alert/ActionSheet关闭后 不继续显示队列中的其他弹窗 (相当于暂停了), 然后你可以通过手动调用+ (void)continueQueueDisplay;来继续显示

.LeeContinueQueue(NO)
szmichaelyb commented 3 years ago

这个暂停 只是 暂停 当前弹窗到队列中显示?

我一直理解的是:当前即将要弹起来的弹窗可能不会加入队列,但是优先级又没有队列中优先级最高的那个弹框优先级高。 此时,我希望让当前弹框显示(如果优先级没有队列中优先级最高的那个弹框高,框架不会让其显示),那么我可以暂停队列,然后让当前弹窗展示。

请问我这么理解不对吗?

如果理解正确,我是否可以这么做:

在弹当前弹框时,先查询一下弹框队列是否为空:

/** 队列是否为空 */
+ (BOOL)isQueueEmpty;

(1) 如果不为空,我手动暂停该队列(这里缺少一个全局暂停队列的函数):

/** 暂停队列显示 */
+ (void)suspendQueueDisplay;

如果队列为空,就不用管了。

(2) 当前弹框,相关操作执行完毕了,再次查询队列是否为空,不为空,继续队列:

/** 继续队列显示 */
+ (void)continueQueueDisplay;

另外,最近在对LEEAlert做工具类封装, 探求不从外界传一个 LeeContinueQueue(YES) 来暂停队列,因为发现既然全局提供了继续队列的函数,为啥就不提供暂停的函数呢?这么设计是基于什么考虑呢?

lixiang1994 commented 3 years ago

首先不是所有弹窗都有队列的需求, 也不是所有队列的弹窗都有暂停的需求, 你可以看到默认是.LeeContinueQueue(YES), 也就是说 如果你有一堆弹窗需要队列且队列显示可能会因为某种原因中断 然后又因某种原因继续显示的, 这就可以很好的满足你的需求了

lixiang1994 commented 3 years ago

按照你的需求 你封装工具类 需要封装暂停功能, 那么可以把你封装的所有弹窗设置.LeeContinueQueue(NO), 然后强制调用+ (void)continueQueueDisplay;方法. 效果一样的

szmichaelyb commented 3 years ago

刚才测试了一下,发现了一些问题,是我理解不对么?

使用场景如下:

场景一:

(1) 先run一堆弹框,都加入队列;
(2) 最后在run一个不加入队列的弹框,但在当前弹框设置暂停当前队列。

测试结果:

发现最后run的弹框只要优先级低于队列弹框优先级最高的那个弹框,暂停队列不起作用; 并且,最后run的这个弹框,连展示的机会都没有~

场景二:

(1) 先run一堆弹框,都加入队列;
(2) 最后在run一个加入队列的弹框,但在当前弹框设置暂停当前队列。

测试结果:

不管最后run的弹窗优先级设置高低,暂停队列,能起作用,是正常的~

lixiang1994 commented 3 years ago

我描述的有些问题, 总结一下

优先级和队列是两个东西, 他俩可以组合

当前如果有一个显示中的弹窗, 此时要显示一个新的弹窗:

有无队列的关键区别在于: 被关闭后是否还能继续被显示.