toLua消息監聽和發送(區別於LuaframeWork框架自帶的Events.lua)


基於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM