Lua 消息分发代码

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')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容