事件分发器

作者: maikesen | 来源:发表于2018-03-22 10:06 被阅读0次

这个分发器是之前做slg的丹神写的,后面再稍微修改了存在的bug(有注释部分是修改过的)。

Dispatcher.lua

local Dispatcher = {}
Dispatcher.obj = {}

function Dispatcher:addEventListener(eventName, class, callBackFunc)
    if self.obj[eventName] then
        local t = self.obj[eventName]
        t[class] = callBackFunc
    else
        local t = {}
        t[class] = callBackFunc
        self.obj[eventName] = t
    end
end


function Dispatcher:removeEventListener(eventName, class)
    local t = self.obj[eventName]
    if t then
        t[class] = nil
        local haveAnyChild = false
        for _, _ in pairs(t) do
            haveAnyChild = true
            break
        end
        if not haveAnyChild then
            self.obj[eventName] = nil
        end
    end

    if(self.temps ~= nil) then
        for _,temp in pairs(self.temps) do
            if(temp.eventName == eventName) then
                local keys = nil
                for func,class_ in pairs(temp) do
                    if(class_ == class) then
                        keys = keys or {}
                        keys[func] = true
                    end
                end
                if(keys ~= nil) then
                    for func,_ in pairs(keys) do
                        temp[func] = nil
                    end
                end
            end
        end
    end
end

function Dispatcher:removeAllEventListener()
    for k, v in pairs(self.obj) do
        self.obj[k] = nil
    end
end

function Dispatcher:dispatchEvent(event)
    -- 遍历事件的时候产生的问题:
    --   某个函数的回调中增加或移除该类型的事件监听,造成表格混乱,遍历不到或多次遍历的问题
    --      为了解决上面的问题,引入一个临时表,但又引入了新的问题:
    --          在回调中移除临时表后面的回调函数的时候,临时表中的回调没有删除,这样继续引入新的表格控制
    local eventName = event["name"]
    local t = self.obj[eventName]
    if t then
        local helper = {}             -- 为了解决某个函数的回调中增加或移除该类型的事件监听,造成表格混乱,遍历不到或多次遍历的问题
        self.temps = self.temps or {} -- 解决上面遍历时移除事件监听的问题
        self.temps[helper] = {}
        local temp = self.temps[helper]
        temp.eventName = eventName
        for class, func in pairs(t) do
            temp[func] = class
            table.insert(helper, func)
        end
        repeat
            local func = table.remove(helper, 1)
            if(not func) then break end

            if(temp[func] ~= nil) then
                func(event)
            end
        until false
        self.temps[helper] = nil
    end
end

return Dispatcher

用法:
新增事件监听
Dispatcher:addEventListener(Event.UI_WINDOW_CLOSE, self, handler(self, self.onWindowClose))
移除事件监听
Dispatcher:removeEventListener(Event.UI_WINDOW_CLOSE, self)

相关文章

  • Unreal4创建分发器事件0035bate1

    创建分发器事件 创建可以绑定并添加到事件分发器的事件列表中的事件。 使用事件分发器的菜单上的 事件(Event) ...

  • Unreal4绑定和解除绑定事件0033bate1

    绑定和解除绑定事件 将事件添加到事件分发器事件列表(以及从中移除事件)。 如果事件分发器未绑定任何事件,对其进行调...

  • 事件分发器

    这个分发器是之前做slg的丹神写的,后面再稍微修改了存在的bug(有注释部分是修改过的)。 Dispatcher....

  • Unreal4调用事件分发器0034bate1

    调用事件分发器 调用事件分发器来执行事件列表中当前绑定的所有事件。 使用 Call 节点调用一个Event Dis...

  • Unreal4事件分发器0032bate1

    事件分发器 允许蓝图类向关卡蓝图报告其状态。 通过将一个或多个事件绑定到 事件分发器(Event Dispatch...

  • Android 事件

    事件分为按键事件分发,触摸事件分发,还有轨迹球事件,轨迹球已经被淘汰,按键事件分发主要是在TV上,使用遥控器做按键...

  • QT3

    1、事件处理2、定时器3、Event事件分发器4、事件过滤器5、QPainter绘图6、绘图设备的使用7、Qfil...

  • View绘制流程及事件分发

    事件分发相关 1、事件分发流程 ViewGroup的事件分发 View的事件分发 View和ViewGroup的O...

  • Activity 对点击事件的分发机制

    ViewGroup对点击事件的分发机制View 对点击事件的分发机制 事件分发流程概述 注:Android事件分发...

  • 事件分发机制总结

    事件分发 所谓事件,就是点击事件,即MitionEvent对象;事件分发,就是对MotionEvent事件的分发过...

网友评论

    本文标题:事件分发器

    本文链接:https://www.haomeiwen.com/subject/ooioqftx.html