Lua监听事件观察者模式(多个监听者监听)
fireEvent 产生事件,创建协程分发(在registerEventListener注册过的事件中通过事件名字找到对应的信息,然后执行对应模块的OnEvent函数),多个地方都注册了同一个事件的话,则所有监视该事件的模块都会收到
1 -- 事件ID
2 -- 可配置与配置表中(TODO)
3 activity_manager.activityEventId = {}
4 activity_manager.activityEventId.EVENT_TEST = 1;
5
6 -- 事件表
7 local event_tb = {}
活动状态改变事件监听相关函数
1 function activity_manager:registerEventListener(layerName, eventId, func)
2 if type(eventId) ~= "number" then
3 print('ROORR:: activityEventId 参数非法')
4 return
5 end
6
7 if event_tb[eventId] ~= nil then
8 local _samelayer = false
9 for k, v in pairs(event_tb[eventId].monitor) do
10 if v.layerName == layerName then
11 print('WARNING:: eventId和layerName都一样前面的注册信息会被覆盖', eventId, layer)
12 _samelayer = true
13 v.func = func
14 end
15 end
16 if not _samelayer then
17 local _monitor = {}
18 _monitor.layerName = layerName
19 _monitor.func = func
20 table.insert(event_tb[eventId].monitor, _monitor)
21 end
22 else
23 event_tb[eventId] = {}
24 event_tb[eventId].monitor = {}
25 local _monitor = {}
26 _monitor.layerName = layerName
27 _monitor.func = func
28 table.insert(event_tb[eventId].monitor, _monitor)
29 end
30 end
注册活动事件监听者
1 function activity_manager:releaseEventListener(layerName, eventId)
2 for v in pairs(event_tb[eventId].monitor) do
3 if v.layerName == layerName then
4 v = nil
5 end
6 end
7 end
注销活动事件监听者
1 function activity_manager:dispatchEvent(eventId, args)
2 if type(eventId) ~= "number" then
3 print('ROORR:: activityEventId 参数非法')
4 return
5 end
6
7 if event_tb[eventId] == nil then
8 print('ROORR:: activityEventId 参数不存在')
9 return
10 end
11
12 for k, v in pairs(event_tb[eventId].monitor) do
13 local func = v.func
14 local layerName = v.layerName
15 func(args)
16 end
17 end
事件分发,暂时不支持事件执行中断
1 function activity_manager:fireEvent(eventId, args)
2 if not event_tb or not next(event_tb) then return end
3 local co = coroutine.create( function(eventId, args)
4 self:dispatchEvent(eventId, args)
5 end)
6
7 local status, msg = coroutine.resume(co, eventId, args)
8 assert(status, msg)
9 end
主动产生事件,创建协程分发
1 function activity_manager:releaseEventListenerByName(layerName)
2 for k, v in pairs(event_tb) do
3 for index, _monitor in pairs(v.monitor) do
4 if _monitor.layerName == layerName then
5 v.monitor[index] = nil
6 end
7 end
8 end
9 end
注销某层所有活动事件监听者
Lua监听事件观察者模式(多个监听者监听)的更多相关文章
- Laravel 事件系统用法总结(监听事件,观察者模式)
看这篇文章先复习一下设计模式 : https://www.cnblogs.com/fps2tao/p/9640338.html 在理解了观察者模式后,我们开始正文 Laravel 的事件提供了一个简单 ...
- EventTrigger动态添加监听事件
在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...
- IE浏览器的脚本文本框监听事件
一.IE8的文本框监听事件 由于在IE8所以input和propertychange都不能用,终于皇天不负有心人让我找到了这个:https://github.com/sophiebits/jquery ...
- springboot13 发布和监听事件
spring中的事件驱动模型Event(也叫发布订阅模式),是观察者模式的一个典型的应用 好处:业务解耦,在不影响原来业务逻辑的情况下,加入其它业务 场景: app上线后已实现用户注册功能,现需要在用 ...
- spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- spring监听机制——观察者模式的应用
使用方法 spring监听模式需要三个组件: 1. 事件,需要继承ApplicationEvent,即观察者模式中的"主题",可以看做一个普通的bean类,用于保存在事件监听器的业 ...
- Android中Button的五种监听事件
简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...
- Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)
第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...
- js 获取当前焦点所在的元素、给元素和input控件添加键盘监听事件、添加页面级的键盘监听事件
页面级的键盘监听事件 document.onkeydown = function (event) { var e = event || window.event || arguments.callee ...
- android listview 的监听事件
今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...
随机推荐
- react native 布局问题
1. Text组件里面的 文字垂直居中 <Text style={styles.confirmButtonStyle}>确认</Text> confirmButtonStyle ...
- 关于protobuf报错'tr1/unordered_map' file not found
这个问题的话,查了很多资料,总的来说就是C++版本的问题,新版本的namespace结构变化了,C++库的层级结构变化了 1.config.h HASH_MAP_H HASH_SET_H 新版本 ...
- idea gradle 安装失败
文件下载地址 gradle-> wrapper- > gradle-wrapper.properties 默认安装位置 ~/. gradle 当前项目 ~/. gradle 下载地址 wg ...
- Java基础——IO模型详解
- GDB调用
编译时需要加-g参数: gcc -g -o test main.c 使用GDB执行:gdb test -GDB命令
- 读后笔记 -- Python 全栈测试开发 Chapter11:Python + Requests 实现接口测试
11.1 Requests 框架 11.1.1 requests 请求 1. reqeusts 库 安装 pip install requests 2. requests 库 GET 方法,参数通过 ...
- MinGW、Linux GNU、MSVC编译和链接动态库的分析
这几天研究CMake跨平台项目嘛,用了以下几种编译器: VS2019(MSVC) Linux GNU MinGW 编译之后发现链接动态库发现以下问题: VS2019中如果直接链接CMakeLists. ...
- 修改ubuntu 源
查看源的类型,lsb_release -a Codename: jammy ?这里有可能是其他值. 找到同类型的源,修改:/etc/apt/sources.list
- 浅谈JS输出中的“+”作用问题
背景(问题) web前端考试有这么一道题目(为了阅读方便和应文章的景,小编将题目进行了微调) <input type="number" value="1" ...
- 清空kafka全部数据
1.停止机器上的kafka,停止业务系统 docker容器执行命令: docker stop 容器名称 2.删除kafka存储目录(server.properties文件log.dirs配置,默认为& ...