LuaEventDispatcher

Lua事件系统


--EventDispatcher.lua
local EventDispatcher = {}
EventDispatcher.__index = EventDispatcher

--实例
function EventDispatcher:new()
    local store = nil

    return function(self)
        if store then return store end
        local o =  {}
        setmetatable(o, self)
        self.__index = self
        store = o
        self.m_listeners = {}
        return o
    end
end

--单例
EventDispatcher.instance = EventDispatcher:new()

--注册
function EventDispatcher:addEvent(name,listener)
    -- 先看看事件是否存在
    local index = 1
    if self.m_listeners[name] == nil then
        self.m_listeners[name] = {}
    else
        local existIndex = self:getEventIndex(name,listener)
        if existIndex ~= -1 then
            return
        end
        index = #self.m_listeners[name] + 1                              --存在下标,则下标+1,用于赋值新事件
    end
    --cclog("EventDispatcher:addEvent %s,index = %d",name,index)
    self.m_listeners[name][index] = listener                             --key赋值事件
end

--注销
function EventDispatcher:removeEvent(name,listener)
    if self.m_listeners[name] == nil then
        return
    end
    local existIndex = self:getEventIndex(name,listener)
    if existIndex == -1 then return end
    table.remove(self.m_listeners[name],existIndex)
end

--派发
function EventDispatcher:dispatchEvent(name,...)
    if self.m_listeners[name] == nil then
        return
    end
    for k,v in pairs(self.m_listeners[name]) do                           --单个key对应多个事件
        v(...)
    end    
end

--检查事件下标,没有则返回-1
function EventDispatcher:getEventIndex(name,listener)
    if self.m_listeners[name] == nil then
        return -1
    end
    for i=1,#self.m_listeners[name] do
        if self.m_listeners[name][i] == listener then
            return i
        end
    end
    return -1
end

return EventDispatcher




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值