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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,首先你需要包含头文件 `<signal.h>` 和 `<unistd.h>`,然后你可以使用 `alarm` 函数来设置中断计时器。例如,你可以使用 `alarm(5)` 来设置 5 秒钟后发生中断。 你还需要设置一个信号处理函数来捕获中断信号,例如: ```c #include <signal.h> #include <unistd.h> void my_handler(int signum) { printf("Received signal %d\n", signum); } int main() { signal(SIGALRM, my_handler); // 设置信号处理函数 alarm(5); // 设置 5 秒钟后发生中断 while (1) { // 你的代码 } return 0; } ``` 你还可以使用 `signal` 函数来设置其他信号的处理函数,例如 `SIGINT`(Ctrl+C)或 `SIGTERM`(终止信号)。 希望这些信息能帮到你! ### 回答2: C语言中可以使用signal函数来实现中断计时器。signal函数允许我们为某个特定的信号设置处理函数,这个处理函数会在信号发生时被调用。 首先,我们需要包含相关的头文件: ```c #include <stdio.h> #include <signal.h> #include <unistd.h> ``` 接下来,我们需要定义一个计时器变量和一个信号处理函数: ```c int timer = 0; void timer_handler(int signum) { timer++; } ``` 在信号处理函数中,我们将计时器递增。 然后,在主函数中,我们需要注册信号处理函数并启动计时器: ```c int main() { struct sigaction sa; sa.sa_handler = timer_handler; sigaction(SIGALRM, &sa, NULL); alarm(1); while (1) { sleep(1); printf("Timer: %d\n", timer); } return 0; } ``` 首先,我们使用sigaction函数将timer_handler函数与SIGALRM信号关联起来。SIGALRM信号是一个计时器到达指定时间时自动发送的信号。 接着,我们使用alarm函数设置计时器触发时间间隔为1秒。 最后,在一个无限循环中,我们每秒打印出计时器的值,并调用sleep函数使程序暂停1秒。 这样,就完成了一个简单的中断计时器的编写。当计时器到达指定时间时,程序会收到SIGALRM信号,从而执行我们的信号处理函数,并对计时器进行操作。 ### 回答3: 中断计时器是一种能够测量时间的设备,它使用中断来实现定期的时间间隔。在C语言中,可以使用库函数和一些编程技巧来编写一个中断计时器。 首先,我们需要了解一些基本概念和函数。在C语言中,我们可以使用头文件`<time.h>`中的函数来获取当前时间和日期。其中,函数`clock()`可以用来获取程序运行的时钟个数,函数`CLOCKS_PER_SEC`用于获取每秒的时钟个数。 接下来,我们可以利用C语言中的信号处理函数来实现中断计时器。我们可以使用库函数`<signal.h>`中的函数`signal()`来注册一个信号处理函数。在信号处理函数中,我们可以编写计时器的逻辑。 以下是一个简单的示例代码: ```c #include <stdio.h> #include <signal.h> #include <time.h> volatile int counter = 0; void timer_handler(int signum) { counter++; } int main() { signal(SIGALRM, timer_handler); // 注册信号处理函数 struct itimerval timer; // 设置定时器的初始值 timer.it_value.tv_sec = 1; // 设置秒数 timer.it_value.tv_usec = 0; // 设置微秒数 // 设置定时器的重复间隔 timer.it_interval.tv_sec = 1; // 设置秒数 timer.it_interval.tv_usec = 0; // 设置微秒数 // 启动定时器 setitimer(ITIMER_REAL, &timer, NULL); while (1) { printf("Counter: %d\n", counter); sleep(1); } return 0; } ``` 在上述代码中,我们使用`signal()`函数将信号`SIGALRM`与我们的信号处理函数`timer_handler()`进行关联。然后,我们使用`struct itimerval`结构体来声明一个定时器,并设置其初始值和重复间隔。最后,我们通过`setitimer()`函数启动定时器。 在`timer_handler()`函数中,我们可以编写执行定时任务的逻辑。在示例代码中,我们简单地将全局变量`counter`进行递增。在主函数中,我们使用一个无限循环来打印`counter`的值,并通过`sleep()`函数来阻塞程序。 这样,我们就可以运行这段代码,并观察每秒钟`counter`的值递增,从而实现了中断计时器的功能。当然,具体的实现方式还有很多,可以根据实际需求进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值