–[[ 定时器管理 –]]
local ManagerScheduler = {}
local sharedScheduler = cc.Director:getInstance():getScheduler()
ManagerScheduler._heartTime = 2 –心跳包检测时间
ManagerScheduler._listener = {} –加入监听对象
–[[
全局监听:用于内存检测\心跳包\网络等情况等与场景无关事件
–]]
function ManagerScheduler:startGolbalScheduler()
self._heartBeatHandle = self:scheduleGlobal(function ()
self:checkMemory()
end, self._heartTime)
end
–[[
移除全局监听
–]]
function ManagerScheduler:stopGolbalScheduler()
if self._heartBeatHandle then
self:unscheduleGlobal(self._heartBeatHandle)
self._heartBeatHandle = nil
end
end
–[[
监听对象存在时才执行
@params:参数说明
layer:监听对象
interval:时间间隔
listener:监听回调 默认值:updateTimeCallBack
extraParams :返回数据
mutiName :针对多个定时器加个字段做回调区分
–]]
function ManagerScheduler:insertLocalScheduler(params, mutiName)
assert(type(params) == “table”,”ManagerScheduler:insertLocalScheduler 参数类型错误”)
mutiName = mutiName or 1
self:removeLocalScheduler(params, mutiName)
self._listener[params.layer] = self._listener[params.layer] or {}
params.interval = params.interval or 1
params.listener = params.listener or function () self:updateTimeCallBack(params, mutiName) end
self._listener[params.layer][mutiName] = self:scheduleGlobal(params.listener, params.interval)
return self._listener[params.layer][mutiName]
end
–[[
对象被移除后移除监听
–]]
function ManagerScheduler:removeLocalScheduler(params, mutiName)
if not self._listener[params.layer] then return end
if not mutiName then
for i , v in pairs(self._listener[params.layer]) do
if self._listener[params.layer] and self._listener[params.layer][i] then
self:unscheduleGlobal(self._listener[params.layer][i])
end
self._listener[params.layer][i] = nil
end
self._listener[params.layer] = nil
else
if self._listener[params.layer] and self._listener[params.layer][mutiName] then
self:unscheduleGlobal(self._listener[params.layer][mutiName])
end
self._listener[params.layer][mutiName] = nil
if _G.next( self._listener[params.layer]) == nil then
self._listener[params.layer] = nil
end
end
-- dump(self._listener, "self._listener")
end
function ManagerScheduler:updateTimeCallBack(params , mutiName)
if params.layer and params.layer.updateTimeCallBack then
params.layer:updateTimeCallBack(params.interval, params.extraParams , mutiName)
end
end
– function ManagerScheduler:getListenerLayerID(layer)
– for i,v in pairs(self._listener) do
– if i == layer then
– return v
– end
– end
– return false
– end
function ManagerScheduler:checkMemory()
collectgarbage(“collect”)
collectgarbage(“collect”)
collectgarbage(“collect”)
print(“memorey ” .. collectgarbage(“count”))
end
– start –
–[[
计划一个全局帧事件回调,并返回该计划的句柄。
@function [parent=#scheduler] scheduleUpdateGlobal
@param function 回调函数
@return mixed#mixed ret (return value: mixed) schedule句柄
– ]]
function ManagerScheduler:scheduleUpdateGlobal(listener)
return sharedScheduler:scheduleScriptFunc(listener, 0, false)
end
–[[
计划一个以指定时间间隔执行的全局事件回调,并返回该计划的句柄。
@function [parent=#scheduler] scheduleGlobal
@param function listener 回调函数
@param number interval 间隔时间
@return mixed#mixed ret (return value: mixed) schedule句柄
–]]
function ManagerScheduler:scheduleGlobal(listener, interval)
return sharedScheduler:scheduleScriptFunc(listener, interval, false)
end
–[[
取消一个全局计划
@function [parent=#scheduler] unscheduleGlobal
@param mixed schedule句柄
–]]
function ManagerScheduler:unscheduleGlobal(handle)
sharedScheduler:unscheduleScriptEntry(handle)
end
–[[
计划一个全局延时回调,并返回该计划的句柄。
@function [parent=#scheduler] performWithDelayGlobal
@param function listener 回调函数
@param number time 延迟时间
@return mixed#mixed ret (return value: mixed) schedule句柄
–]]
function ManagerScheduler:performWithDelayGlobal(listener, time)
local handle
handle = sharedScheduler:scheduleScriptFunc(function()
self:unscheduleGlobal(handle)
listener()
end, time, false)
return handle
end
return ManagerScheduler
使用说明:(支持同一个UI多个定时器)
–添加定时器
ManagerScheduler:insertLocalScheduler({layer = self,interval = 1,extraParams = {}}, "updateLeftTime")
ManagerScheduler:insertLocalScheduler({layer = self, interval = 2,}, "dispathCard")
–[[
监听定时器调度返回总口
–]]
function GameTableUI:updateTimeCallBack(dt,extraParams, mutiName)
if mutiName == “updateLeftTime” then
–移除定时器
ManagerScheduler:removeLocalScheduler({layer = self}, “updateLeftTime”)
elseif mutiName == “dispathCard” then
ManagerScheduler:removeLocalScheduler({layer = self}, “dispathCard”)
end
end