EventManager = {} --内部储存事件
--注册事件
function EventManager:AddEventListener(type, func, thisObj)
if (type == nil or func == nil) then
print("nil")
return
end
if (self[type] == nil) then
self[type] = {} --初始化
end
table.insert(self[type], {func, thisObj, false}) --添加事件
end
--注册一次性事件
function EventManager:Once(type, func, thisObj)
if (type == nil or func == nil) then
print("nil")
return
end
if (self[type] == nil) then
self[type] = {} --初始化
end
table.insert(self[type], {func, thisObj, true}) --添加事件
end
--撤销事件
function EventManager:RemoveEventListener(type, func, thisObj)
if (type == nil or func == nil) then
print("nil")
return
end
local listeners = self[type]
if listeners ~= nil then
local delKeys = {}
for k, v in pairs(listeners) do
if (v[1] == func and v[2] == thisObj) then
-- self[k]=nil;--撤销事件
table.insert(delKeys, k)
end
end
self:RemoveListeners(type, delKeys, listeners)
delKeys = nil
else
-- print("error type=" .. type)
end
listeners = nil
end
--撤销全部事件
function EventManager:RemoveAllEventListeners(type)
if (type == nil) then
print("nil")
return
end
self[type] = nil
end
--发送事件
function EventManager:Dispatch(type, ...)
if (type == nil) then
print("nil")
return
end
if self[type] == nil then
return
end
local listeners = self[type]
local delKeys = {}
for k, v in pairs(listeners) do
v[1](v[2], ...)
if v[3] == true then
table.insert(delKeys, k)
end
end
self:RemoveListeners(type, delKeys, listeners)
delKeys = nil
listeners = nil
end
function EventManager:RemoveListeners(type, delKeys, listeners)
if #delKeys > 0 then
for k in ipairs(delKeys) do
table.remove(listeners, k)
end
end
if #listeners == 0 then
self[type] = nil
end
end
--清理
function EventManager:Clear()
self = {}
end
return EventManager
测试
EventManager:AddEventListener('haha', self.OnListernerTest, self)
EventManager:Once('haha', self.OnListernerTest, self)
EventManager:Dispatch('haha', 'data1', 'data2', 'data3')
EventManager:RemoveEventListener('haha', self.OnListernerTest, self)
EventManager:RemoveAllEventListeners('haha')