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
时间: 2024-08-08 12:25:37

toLua消息监听和发送(区别于LuaframeWork框架自带的Events.lua)的相关文章

toLua消息监听和发送(LuaframeWork)

基于uLua/toLua的Luaframework的lua框架的事件系统 github地址:https://github.com/jarjin/LuaFramework_NGUI Luaframework为了我写好了消息的监听和发送,也就是观察者模式的使用方式. 如下图: eventlib是消息处理的一个库. enents是作者为使我们更方便,仿造的C#的消息模式. 我们去调用这个事件系统的使用方式如下: local EventTest = require "events" funct

Spring整合ActiveMQ及多个Queue消息监听的配置

消息队列(MQ)越来越火,在java开发的项目也属于比较常见的技术,MQ的相关使用也成java开发人员必备的技能.笔者公司采用的MQ是ActiveMQ,且消息都是用的点对点的模式.本文记录了实现Spring整合ActivateMQ的全过程及如何使用MQ,便于后续查阅. 一.项目的搭建 采用maven构建项目,免去了copy jar包的麻烦.因此,我们创建了一个java类型的Maven Project (1)项目结构图 先把项目结构图看一下,便于对项目的理解. (2)pom.xml 我们需要加入以

观察者模式和事件监听模式的区别

事件监听模式更像是观察者模式的进阶. 观察者模式中,'主题'会在特定逻辑下通知所有'观察者'.如果这个通知不包含任何信息,那么这种实现就是通常的观察者模式. 如果'主题'通知'观察者'的过程带有一些<其他信息>.那么'主题'本身已经上升成为了'事件源',而通知中带有的<其他信息>经过封装就成为了事件. 事件监听模式的优势:在很多应用场景中,通知中附带的<其他信息>是必不可少的,事件Event则对这些<信息>进行了封装,使它本身拥有了多态的特性.每个事件对象就

mqtt实现自动监听服务器消息

本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论. 首先需求是:多系统对接进行消息实时传递. 安装好mqtt:  npm install mqtt --save 本地服务(可以直接配在java中):这里采用mosca 安装好mosca: npm install mosca --save var mosca=reqire('mosca'); var mqttServer=new mosca.Server({port:8000});

设计模式之监听模式(观察者模式与监听模式区别)

一,类的四大基本关系:  a.关联关系:如A类调用B类. b.继承关系:如A类是B类的父类. c.聚合关系:如装橘子的箱子,箱子是否存在与里面装没装橘子没有任何关系,也就是说橘子不会影响箱子的存在. d.组合关系:如一个小组,小组是否存在与小组中是否有组员是息息相关的,如果没有组员,小组就不存在了. 监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法 观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于

android-----关于通过AIDL注册监听之后无法解除监听的探索

我们在平常使用AIDL时可能会有这样的场景,客户端并不想一直查看服务端有没有有关我的消息,而是想让服务端在有消息的时候能够通知我,随后客户端再去服务端拿消息,这样相对来说比较节省资源,通常我们可以利用观察者模式将客户端注册到服务端,接着有消息的时候服务端相应的通知各个客户端就可以了,这种方式在客户端和服务端处于同一进程的时候使用是没有问题的,因为同一进程内部是可以直接传递对象的,并不会出现注册绑定到服务端和解注册的对象不同的情况,但是如果放到不同进程间的话,因为通信过程中涉及到了序列化反序列化过

rabbitMq与spring boot搭配实现监听

在我前面有一篇博客说到了rabbitMq实现与zk类似的watch功能,但是那一篇博客没有代码实例,后面自己补了一个demo,便于理解.demo中主要利用spring boot的配置方式, 一.消费者(也就是watcher)配置 配置都采用spring的注解进行配置 1.创建连接 @Bean public ConnectionFactory createConnectionFactory() { CachingConnectionFactory connectionFactory = new C

swift项目第六天:中间发布按钮的封装以及监听点击事件

import UIKit /* 总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架,然后给系统的类写分类:extension UIButton {},提供类方法或是构造函数的方法,把与该控件有关的业务逻辑全封装在分类的内部.2:封装方法:类方法:都是以class开头,class func 函数名(参数)->返回值类型{业务逻辑代码,return 返回值}:例子: class fun

js添加事件监听

1)对于大多数浏览器添加事件监听使用addEventListener(),此函数使用方式为obj.addEventListener('method','function',bool);如添加鼠标点击事件click,移动 mousemove等,第二个参数为调用的方法,第三个参数表示是否需要捕捉,是一个bool值:true表示使用capture,false表示bubbling,一般情况下都是用FALSE;此方法对于相同的函数只绑定一次,也就是说重复绑定相同的函数,只执行一次该方法.当一个对象同一种动