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

我们在开发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,点击下载。如有帮助,请多点赞。

### 使用 Simulink 创建时间调度器模型 在嵌入式系统的设计过程中,任务调度是一个重要的环节。为了确保各个功能模块按照预定的时间间隔执行,在Simulink环境中可以采用多种方法来实现这一目标[^1]。 #### 定义任务周期 首先应当明确各任务所需的执行频率即其周期T。这通常是在需求分析阶段就已经确定下来的参数之一。对于实时控制系统而言,合理的设定这些值至关重要,因为它们直接影响系统的响应速度以及稳定性。 #### 构建基础框架 启动MATLAB并打开一个新的Simulink项目文件。接着从Library Browser中拖拽必要的组件至工作区: - **Rate Transition Block**: 当存在不同采样率的任务间数据交换时需要用到此元件;它能够处理多速率信号之间的转换问题。 - **Function Call Generator Blocks or Periodic Sample Time Constraint Blocks**: 前者用于触发特定事件的发生,后者则用来指定固定的采样时刻。这两种类型的源节点都可以作为定时机制的基础构件。 ```matlab % 设置全局配置参数 set_param(gcs,'Solver','FixedStepDiscrete'); set_param(gcs,'StopTime','inf'); % 插入函数调用发生器 add_block('simulink/Sources/Function-Call Generator',... 'model/Fcn_Call_Gen_50ms','-Position',[80 90 120 130]); set_param('model/Fcn_Call_Gen_50ms','SampleTime','0.05') % 设定为50毫秒周期 ``` 上述脚本片段展示了如何通过命令行向当前活动窗口添加具有固定样本时间(这里是50 ms)的功能呼叫生成器实例,并调整求解器选项以适应离散型仿真环境的要求。 #### 组织逻辑结构 围绕着选定的核心计时单元构建其余部分的架构。比如利用Stateflow图表表达复杂的有限状态机行为模式,或是借助Subsystem封装重复使用的子网路。重要的是要保持整体布局清晰易懂,便于后期维护与扩展。 #### 实现具体业务逻辑 针对每一个管理的对象编写相应的动作序列——无论是简单的算术运算还是较为复杂的状态迁移过程。务必注意遵循良好的编程实践准则,如合理分配资源、避免死锁现象等潜在风险因素。 #### 测试验证 完成初步搭建之后,应该进行全面而细致的质量检验工作。一方面可以通过观察内部变量的变化趋势判断程序是否按预期运作;另一方面也可以引入外部干扰项考验鲁棒性能指标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值