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的使用,如果你也已经写好了列表那么恭喜这一 ...
随机推荐
- shell 脚本请求接口报错
2023-01-18 22:07:07.984 WARN 11700 --- [io-9044-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : ...
- Kubernetes--Pod存活性探测(设置exec探针)
有不少应用程序长时间持续运行后会逐渐转为不可用状态,并且仅能通过重启操作恢复,Kubernetes的容器存货性探测机制可发现诸如此类的问题,并根据探测结果结合重启策略触发后续的行为.存活性探测是隶属于 ...
- for循环axios套axios调用,同步调取
1.function getsdd(){}事件 async/await把异步进行设置成同步进行 var url = '/api/runtime/form/save'; function checkAd ...
- Hadoop完全分布式开发配置流程
完全分布式开发 整体流程 1.准备3台纯净虚拟机 2.修改每台ip,主机名,主机映射,关闭防火墙 3.安装jdk和hadoop,配置环境变量 4.集群分发脚本编写 5.集群配置 6.ssh免密登录 7 ...
- xh_零基础网站渗透第一部
一.认识常见网站类型 1.1asp:asp是动态服务器页面(active server page)的英文缩写.是微软公司开发的代替cgi脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单 ...
- 2023-03-01 Error: Invalid hook call.Hooks can only be called inside of the body of a function component.
问题描述:rn项目使用钩子useState,详细报错如下: Error: Invalid hook call. Hooks can only be called inside of the body ...
- 攻防世界-fileinclude
一道简单的文件包含题目,源代码如下 一.代码分析 此题中关键代码为 分析此处代码可知,$lan的值是cookie中language所对应的值,当该值不为english时,会将$lan的值与.php字符 ...
- js 动态给table添加、删除行。
1.添加table 行 function addtablTr() { var $table = $("#abc"); var vTr = '<tr><td> ...
- POWER BI - 根据条件,改变数值的颜色Conditional formatting
在visual块,右键Column选择Conditional formatting 举例,比如difference > 0 显示红色,否则<0显示绿色 如何根据 measure 写特定条件 ...
- wpf TreeView右键选中节点弹菜单
<TreeView x:Name="CustomTreeView" Canvas.Top="1" Canvas.Bottom="1" ...