toLua消息監聽和發送(區別於LuaframeWork框架自帶的Events.lua)
阿新 • • 發佈:2017-09-25
oca http 設置 code listeners func ner dev 表結構
基於uLua/toLua的Luaframework的lua框架的事件系統
github地址:https://github.com/jarjin/LuaFramework_NGUI
用法與Luaframework框架自帶的Events.lua的用法一致,解決了回調時報錯不拋錯誤的問題。
local _Events = {} local EventDispatcher = {} function EventDispatcher:ctor( ) _Events = {} end --[[ 表結構 { type = { Listener1, Listener2 } } ]]--註冊監聽事件 function EventDispatcher:AddEventListener(stype,Listener) if type(stype) ~= "string" or type(Listener) ~= "function" then error("AddEventListener error : type error ",2) return end --獲取_Events裏面事件 local eventlist = _Events[stype]if eventlist == nil then eventlist = {} table.insert(eventlist,Listener) --想隊列裏面插入一個事件 _Events[stype] = eventlist --放到大表裏面 else local func = eventlist[Listener] if func == nil then table.insert(eventlist,Listener)else error("AddEventListener error : listeren hai in") end end end --[[ 觸發 ]] function EventDispatcher:Dispatcher(stype,...) if type(stype) ~= "string" then error("Dispatcher error : stype error",1) return end local listeners = _Events[stype] if listeners == nil or #listeners <= 0 then return end for i,v in ipairs(listeners) do v(...) end end --[[ 移除指定類型的所有關聯事件偵聽,如果參數為nil則刪除當前註冊器中所有的函數偵聽 listener ~= nil 刪除這個類型裏面這個監聽 ]] function EventDispatcher:RemoveEventListeners(stype,listener) --空刪除所有清空表 if stype == nil then --獲取keys local keys = table.keys(_Events) for i,v in ipairs(keys) do _Events[v] = nil --設置為空 end return end if type(stype) ~= "string" then error("RemoveEventListeners error : stype no string",2) return end local typeListeners = _Events[stype] --取出裏面所有的這個類型的func --根據類型刪除 if listener ~= nil and type(listener) == "function" then if typeListeners ~= nil and table.nums(typeListeners) > 0 then if typeListeners[listener] ~= nil then typeListeners[listener] = nil end end return end --刪除一個類型 if typeListeners ~= nil then _Events[stype] = nil end end function EventDispatcher:DumpEvent( ) dump(_Events) end return EventDispatcher
toLua消息監聽和發送(區別於LuaframeWork框架自帶的Events.lua)