一个全局的定时事件发生器

我们在开发iOS App过程中常会有这样的需求,就是每隔一段时间内做一些类似刷新数据的操作。比如股票行情软件,需要每隔几秒更新股指、股票价格。这样的定时事件可能有很多种,发生事件的间隔都各不相同。我们可以实现一个全局的事件发生器,统一管理这些定时事件,简化操作。IFTimer类就是为此目的而来。

IFTimer的功能

  1. 添加、删除定时事件
  2. 添加、删除接收事件的对象
  3. 开始、停止事件发生器
  4. 设置事件发生器的灵敏度

IFTimer的原理

  1. 利用NSTimer作为事件的发生器
  2. 利用NSNotificationCenter作为事件的注册和通知

示例代码讲解

image
1. 创建IFTimer实例并初始化定时事件。在一个App里,你只需要创建一个实例即可。

[_timer addEvent:EVT_NAME1 interval:[NSNumber numberWithFloat:1.0]];
[_timer addEvent:EVT_NAME2 interval:[NSNumber numberWithFloat:5.0]];
[_timer addEvent:EVT_NAME3 interval:[NSNumber numberWithFloat:10.0]];

这里添加了三个事件,分别间隔1秒、5秒、10秒发生一次。
2. 注册需要监听这些事件的对象

[IFTimer addObserver:self selector:@selector(updateEvt1:) evtName:EVT_NAME1];
[IFTimer addObserver:self selector:@selector(updateEvt2:) evtName:EVT_NAME2];
[IFTimer addObserver:self selector:@selector(updateEvt3:) evtName:EVT_NAME3];

每个事件名对应一个响应的函数。
3. 启动事件发生器

[_timer start];

4.处理事件响应函数

- (void)updateEvt1:(NSNotification*)sender
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        self._evtCount1++;
        [_lable1 setText:[NSString stringWithFormat:@"%@ comes, count %ld", EVT_NAME1, self._evtCount1]];
    }];
}

5.不需要再监听事件时,可以移除事件监听

[IFTimer removeObserver:self evtName:EVT_NAME1];
[IFTimer removeObserver:self evtName:EVT_NAME2];
[IFTimer removeObserver:self evtName:EVT_NAME3];

其他

IFTimer是100毫秒检查一次定时事件是否已到,你可以通过下面的接口调整这个事件,可以加快或减慢检查的频率

- (void)setActiveInterval:(NSTimeInterval)interval;

代码已放到GitHub,点击下载。如有帮助,请多点赞。

### 微信小程序全局定时弹窗实现方式 要在微信小程序中实现全局定时弹窗功能,可以通过以下几种技术手段来完成: #### 1. **利用 `wx.setStorageSync` 和 `setTimeout`** 通过将定时器存储在本地缓存中,并结合页面生命周期函数(如 `onShow` 或 `onLoad`),可以在特定时间触发弹窗。 ```javascript // app.js 中设置全局变量或方法 App({ globalData: { timerId: null, }, setGlobalTimer(seconds, callback) { const that = this; clearTimeout(that.globalData.timerId); // 清除之前的计时器以防重复 that.globalData.timerId = setTimeout(() => { wx.showModal({ // 使用 showModal 展示弹窗 title: '提示', content: '这是一个全局定时弹窗', success(res) { if (res.confirm) { console.log('用户点击了确认'); } else if (res.cancel) { console.log('用户点击了取消'); } } }); typeof callback === 'function' && callback(); // 执行回调函数 }, seconds * 1000); }, }); ``` 调用该方法时,在任何页面都可以通过 `getApp()` 调用: ```javascript const app = getApp(); app.setGlobalTimer(5, () => { // 设置 5 秒后弹出 console.log('定时器执行完毕'); }); ``` 这种方法适用于简单的场景,但需要注意清理计时器以防止内存泄漏[^1]。 --- #### 2. **基于自定义组件的解决方案** 如果希望更灵活地管理弹窗状态,可以封装一个自定义组件作为全局弹窗容器。以下是具体实现步骤: ##### 创建自定义组件 `global-modal.wxml` ```html <view hidden="{{!isShowing}}" class="modal-container"> <view class="modal-content"> {{content}} <button bindtap="close">关闭</button> </view> </view> ``` ##### 组件逻辑 `global-modal.js` ```javascript Component({ properties: { isShowing: { type: Boolean, value: false, }, content: { type: String, value: '', }, }, methods: { close() { this.setData({ isShowing: false }); }, }, }); ``` ##### 在 App 的根节点引入并控制显示隐藏 修改 `app.json` 添加全局组件路径: ```json { "usingComponents": { "global-modal": "/components/global-modal/global-modal" } } ``` 在任意页面中动态控制弹窗展示: ```javascript Page({ data: { showGlobalModal: false, modalContent: '', }, onLoad() { const that = this; setTimeout(() => { that.setData({ showGlobalModal: true, modalContent: '这是来自页面的全局定时弹窗', }); }, 3000); // 延迟 3 秒弹出 }, }); ``` 这种方式更加模块化,适合复杂的应用结构[^4]。 --- #### 3. **使用 WebSocket 推送通知** 对于需要后台主动推送的通知类弹窗,可借助 WebSocket 技术实现实时通信。例如,服务器端设定某个事件发生时向客户端发送消息,前端收到消息后立即弹出窗口。 WebSocket 配置示例: ```javascript wx.connectSocket({ url: 'wss://example.com/websocket', // 替换为实际地址 }); wx.onSocketMessage((message) => { wx.showToast({ title: message.data || '有新消息到来!', icon: 'none', duration: 3000, }); }); ``` 这种方案特别适合多设备同步需求较高的场合,比如闹钟提醒、聊天室消息等[^5]。 --- ### 注意事项 - 如果遇到某些区域无法响应点击操作的情况,请检查 CSS 是否设置了 `pointer-events:none;`,必要时调整样式[^3]。 - 对于复杂的交互逻辑建议采用 Vuex 数据流管理模式统一处理状态变化。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值