zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    十天冲刺
    《构建之法》阅读笔记04
    每周学习进度第九周
    构建之法阅读笔记03
    返回一个一维整数数组中最大子数组的和(2)
    学习进度条
    冲刺日志05
    冲刺日志04
    冲刺日志03
    冲刺日志02
  • 原文地址:https://www.cnblogs.com/vsirWaiter/p/7590445.html
Copyright © 2011-2022 走看看