标签:insert data add 变长参数 nbsp demo remove function 事件监听器
MessageManager.lua
local messageManager = {mEventTable = {},mEventUserData = {}}
--注册事件
function messageManager.Add(EventName,Func,UserData)
assert( Func )
messageManager.mEventTable[ EventName ] = messageManager.mEventTable[ EventName ] or {}
local Event = messageManager.mEventTable[ EventName]
table.insert(Event,Func)
messageManager.mEventUserData[ EventName ] = messageManager.mEventUserData[ EventName ] or {}
local userDataTable = messageManager.mEventUserData[ EventName ]
userDataTable[ Func ] = UserData or true
end
--移除事件
function messageManager.Remove(EventName,Func)
assert( Func )
local Event = messageManager.mEventTable[ EventName ]
if not Event then
return
end
table.remove(Event)
end
--派发消息
function messageManager.Dispatch(EventName)
assert(EventName)
if (messageManager.mEventTable[EventName] == nil) then
return
end
local Event = messageManager.mEventTable[EventName]
for i,Func in ipairs(Event) do
Func(messageManager.mEventUserData[EventName][Func])
end
end
return messageManager
User.lua
--获取事件监听器
local MessageManager = require ‘MessageManager‘
--注册事件“a”
MessageManager.Add("a",function(a) print(a) end,"\"a\" happened!")
--事件“a”发生
MessageManager.Dispatch("a")
print("-------------------")
--移除事件“a”
MessageManager.Remove("a",function(a) print(a) end)
--事件“a”发生
MessageManager.Dispatch("a")
运行User.lua得到的结果:
可以看到注册事件“a”之后,当事件“a”发生之后,相对应的回调函数被事件监听器执行了;当移除事件“a之后”,事件“a”再次发生的时候,事件监听器并没有再执行事件监听者注册事件时留下的回调函数。
这次完成的事件监听器只是个简单的demo,还有很多地方没有完善的,比如同一个事件被多个事件监听者注册的情况以及同一个事件被同一个事件监听者注册的情况,还有回调函数的参数为可变长参数的情况。
这篇博客只是我自己在学习lua路上的一点学习记录,希望大家多多指教。
---------------------
标签:insert data add 变长参数 nbsp demo remove function 事件监听器
原文地址:https://www.cnblogs.com/ly570/p/11277971.html