lua下的事件分发器

cc.vv = cc.vv or {}

cc.vv.eventsListener = {}

-- start --
--------------------------------
-- @class function registerEventListener
-- @description 注册事件回调
-- @param eventType 事件类型
-- @param target 实例
-- @param method 方法
-- @return
-- cc.vv.registerEventListener(2, self, self.eventLis)
-- end --
local function registerEventListener(eventType, target, method)
    if not eventType or not target or not method then
        return
    end

    local eventsListener = cc.vv.eventsListener
    local listeners = eventsListener[eventType]
    if not listeners then
        -- 首次添加eventType类型事件,新建消息存储列表
        listeners = {}
        eventsListener[eventType] = listeners
    else
        -- 检查重复添加
        for _, listener in ipairs(listeners) do
            if listener[1] == target and listener[2] == method then
                return
            end
        end
    end

    -- 加入到事件列表中
    local listener = {target, method}
    table.insert(listeners, listener)
end
cc.vv.registerEventListener = registerEventListener

-- start --
--------------------------------
-- @class function dispatchEvent
-- @description 分发eventType事件
-- @param eventType 事件类型
-- @param ... 调用者传递的参数
-- @return
-- end --
local function dispatchEvent(eventType, ...)
    if not eventType then
        return
    end
    local listeners = cc.vv.eventsListener[eventType] or {}
    for _, listener in ipairs(listeners) do
        -- 调用注册函数
        listener[2](listener[1], eventType, ...)
    end
end
cc.vv.dispatchEvent = dispatchEvent

-- start --
--------------------------------
-- @class function removeTargetEventListenerByType
-- @description 移除target注册的事件
-- @param target self
-- @param eventType 消息类型
-- @return
-- end --
local function removeTargetEventListenerByType(target, eventType)
    if not target or not eventType then
        return
    end

    -- 移除target的注册的eventType类型事件
    local listeners = cc.vv.eventsListener[eventType] or {}
    for i, listener in ipairs(listeners) do
        if listener[1] == target then
            table.remove(listeners, i)
        end
    end
end
cc.vv.removeTargetEventListenerByType = removeTargetEventListenerByType

-- start --
--------------------------------
-- @class function removeTargetAllEventListener
-- @description 移除target的注册的全部事件
-- @param target self
-- @return
-- end --
local function removeTargetAllEventListener(target)
    if not target then
        return
    end

    -- 移除target注册的全部事件
    for _, listeners in pairs(cc.vv.eventsListener) do
        for i, listener in ipairs(listeners) do
            if listener[1] == target then
                table.remove(listeners, i)
            end
        end
    end
end
cc.vv.removeTargetAllEventListener = removeTargetAllEventListener

-- start --
--------------------------------
-- @class function removeAllEventListener
-- @description 移除全部消息注册回调
-- @return
-- end --
local function removeAllEventListener()
    cc.vv.eventsListener = {}
end
cc.vv.removeAllEventListener = removeAllEventListener

cc.vv是一个全局自定义的表,加入进去方便使用

posted @ 2019-11-21 16:01  博_客园的张斯瑞  阅读(245)  评论(0编辑  收藏  举报