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监听事件观察者模式(多个监听者监听)的更多相关文章

  1. Laravel 事件系统用法总结(监听事件,观察者模式)

    看这篇文章先复习一下设计模式 : https://www.cnblogs.com/fps2tao/p/9640338.html 在理解了观察者模式后,我们开始正文 Laravel 的事件提供了一个简单 ...

  2. EventTrigger动态添加监听事件

    在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...

  3. IE浏览器的脚本文本框监听事件

    一.IE8的文本框监听事件 由于在IE8所以input和propertychange都不能用,终于皇天不负有心人让我找到了这个:https://github.com/sophiebits/jquery ...

  4. springboot13 发布和监听事件

    spring中的事件驱动模型Event(也叫发布订阅模式),是观察者模式的一个典型的应用 好处:业务解耦,在不影响原来业务逻辑的情况下,加入其它业务 场景: app上线后已实现用户注册功能,现需要在用 ...

  5. spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  6. spring监听机制——观察者模式的应用

    使用方法 spring监听模式需要三个组件: 1. 事件,需要继承ApplicationEvent,即观察者模式中的"主题",可以看做一个普通的bean类,用于保存在事件监听器的业 ...

  7. Android中Button的五种监听事件

    简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...

  8. Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)

    第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...

  9. js 获取当前焦点所在的元素、给元素和input控件添加键盘监听事件、添加页面级的键盘监听事件

    页面级的键盘监听事件 document.onkeydown = function (event) { var e = event || window.event || arguments.callee ...

  10. android listview 的监听事件

    今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...

随机推荐

  1. Jenkins+Git+Gitlab+Ansible 持续集成和自动部署

  2. 李光耀观天下.PDF

    书本详情 李光耀观天下作者: 李光耀出版社: 北京大学出版社原作名: 李光耀观天下出版年: 2015-6页数: 299装帧: 平装ISBN: 978730125751

  3. fetch,axios简介与语法

    fetch简介&语法 留心:像之前的XMLHttpRequest 但并不真的是,而是代替的 #概念:fetch是ecma组织基于promise开发http api ,用来代替xhr  #语法: ...

  4. typora文件中不显示公式

    行内公式在typora中不显示 解决办法 打开typora--文件(F)--偏好设置--markdown--内联公式--打勾选中 若改后没有反应,关闭重新打开.

  5. oracle job的使用

    select job, next_date, next_sec, failures, broken from user_jobs; create or replace sequence END_RES ...

  6. 打开IE浏览器被强制跳转至edge

    打开edge浏览器,右上角更多,设置,默认浏览器,设置"从不" 控制面板,Internet选项,高级,浏览,取消勾选"启用第三方浏览器扩展"

  7. pycharm 连接 docker容器

    1.ubuntu 18.04 先安装sudo apt-get install openssh-server 2.修改" /etc/ssh/sshd_config" 改成 Permi ...

  8. Win10下VM虚拟机桥接模式无法上网的相关问题?

    首先:在LR中点击虚拟机->设置,勾选桥接模式,勾选之后无法上网 1.    选中虚拟网卡VMnet8(NAT模式)和WLAN(本机)网卡,右键选择"桥接",然后系统创建一个 ...

  9. Windows下使用Fortran读取HDF5文件

    需要用Fortran读取HDF5格式的GPM IMERG卫星降水文件,在已经安装HDF5库(参见VS2019+ Intel Fortran (oneAPI)+HDF5库的安装+测试 - chinago ...

  10. 查询最上活动的activity

    adb shell dumpsys window windows | grep mCurrent