需求场景:
在用户长按升级按钮一段时间以后,提供快速的连续升级反馈。
需求分析:
最简单的实现方式是直接使用一个大循环持续调用升级接口。但如果升级反馈中包含了与后端的数据交互,或者其它比较大量的界面更新,又或者因为其它原因导致该方式不能满足连续快速反馈时,这里提供一种使用前端模拟的方式完成长按升级的思路;
思路概述:
首先设计的主要想法是尽量减少单次循环中需要处理的更新,设计一个MockLevelUpUpdate模拟实际更新,然后在MockLevelUpUpdate中去掉原本 RealLevelUpUpdate中消耗比较大的部分。另外如果每次刷新所需的数据的获取比较耗时的话(比如每次数据都需要后端返回时),则最好提前生成好本次长按升级所需的每一级的数据,然后在循环刷新时直接使用;
伪代码描述:
RealLevelUpUpdate 原本存在的比较重的刷新代码,如无必要不需要修改:
-- 真实刷新 (原本存在的刷新代码,如无必要不需要修改)
function RealLevelUpUpdate()
MassiveUpdate() -- 比较麻烦的刷新
LightUpdate_1() -- 比较轻量的刷新
end
插入下列几个新函数
MockLevelUpUpdate 重写一个新的模拟刷新,去掉原本刷新中的比较重的部分:
-- 重写一个模拟刷新
function MockLevelUpUpdate()
LightUpdate_2() -- 只进行轻量的刷新,或明确需要在长按中表现的刷新
end
GenerateData 数据准备,提前准备好刷新中可能会用到的数据,避免循环时临时处理导致的卡顿(或者如果升级后所需的数据来自于后端,则需要在这个阶段提前获取到or前端自己生成):
-- 提前准备一个数据表,记录每次升级后界面LightUpdate_2可能使用到的数据(避免长按循环过程中频繁访问数据导致的卡顿)
function GenerateData()
levelData = {
[1] = {...}, -- 升级到1级时需要的数据
[2] = {...}, -- 升级到2级时需要的数据
[3] = {...}
}
return levelData
end
OnDown 长按按下时触发函数
OnUp 长按抬起时触发函数
其中OnDown的循环中要借助levelData 对当前循环到的状态进行更新,触发抬起OnUp时中断循环,或者长按到无法升级时主动结束并触发OnUp;
OnUp函数将会调用 RealLevelUpUpdate 调用真实的刷新将界面的实际状态同步。至此结束。
-- 按下时触发
function OnDown()
levelData = GenerateData() -- 生成升级所需的数据表
while ( 没有抬起时 )
{
if ( 当前已经无法继续升级 ) -- 使用 levelData 判断是否可以继续升级
{
OnUp() -- 调用OnUp
break;
}
MockLevelUpUpdate() -- 使用LevelData 进行刷新
}
end
-- 抬起时触发
function OnUp()
RealLevelUpUpdate() -- 调用一次RealLevelUpdate将实际状态更新到最新
end
优点:这种实现方式对于原本存在的代码无需很大改动。直接插入上述代码即可。
缺点:每次都要单独重写MockLevelUpdate方法,同时生成LevelData也需要前端了解后端的算法实现,会增加不小的工作量;因此该方法仅适合普通的循环调用无法满足需求时使用。