iOS开发笔记>> 以 schedcledTimerWithTimerInterval…的方式触发的 timer,在滑动页面上的列表时,timer 会暂停回调,为什么?如何解决?

41 篇文章 0 订阅
10 篇文章 0 订阅

遇到的问题: 

timer 本身不能自动循环的做一些事, 必须把它加入到消息循环后才能处理一些事情, 而用 scheduleTimerWithTimeInterval 的方式创建的 timer 做了两件事情: 

1. 创建了 NSTimer 对象

2. 把这个 timer 加入到当前 RunLoop 的 NSDefaultRunLoopMode 中

因为线程一般情况下就是 NSDefaultRunLoopMode 模式, 而刚用 scheduleTimerWithTimeInterval 方式创建的 timer 也是加入到 NSDefaultRunLoopMode 中的, 因此子啊平时情况下, NSTimer 都能正常工作, 但当你在界面上进行滑动时, 当前的 RunLoop 会立即进入 UITrachingRunLoopMode 模式, 此时与 timer 所加入的模式并不是同一种, 因此 timer 就会暂时停止回调, 直到停止滑动, 从 UITrachingRunLoopMode 转回 NSDefaultRunLoopMode 时才能继续正常工作. 


解决办法: 

用 scheduleTimerWithTimeInterval 的方式创建完 timer 对象后, 立即获取当前线程的 RunLoop, 然后添加 timer 到 NSRunLoopCommomModes 中, 因为 NSRunLoopCommomModes 模式代表把 timer 加入到所具有"Common"属性标记的模式中. 而 NSDefaultRunLoopMode 和 UITrachingRunLoopMode 这两种模式都具有"Common"属性标记. 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libuv 中的定器是一个结构体,名为 `uv_timer_t`。在创建定,我们使用 `uv_timer_init` 函数来初始化这个结构体,然后使用 `uv_timer_start` 函数来启动定器。启动定,我们需要指定一个回调函数,用来处理定触发事件。这个回调函数的类型为 `uv_timer_cb`,它的参数类型为 `uv_timer_t *`,表示定器结构体的指针。 因此,定回调函数的参数类型必须是 `uv_timer_t *`。如果您需要在定回调函数中传递其他参数,可以使用结构体或全局变量来保存这些参数。例如,可以定义一个结构体,将定器结构体指针和其他参数一起保存在这个结构体中,然后在回调函数中使用这个结构体来获取参数。 下面是一个示例代码,将定器结构体指针和一个整数参数一起保存在一个结构体中,并在回调函数中使用这个结构体来获取参数: ```c #include <stdio.h> #include <uv.h> typedef struct { uv_timer_t *timer; int num; } my_timer_t; // 定器处理函数 void on_timer(uv_timer_t *timer) { my_timer_t *my_timer = timer->data; printf("Tick %d\n", my_timer->num); my_timer->num++; } int main() { uv_loop_t *loop = uv_default_loop(); // 创建定器 uv_timer_t timer; uv_timer_init(loop, &timer); // 创建自定义定器结构体 my_timer_t my_timer = { &timer, 0 }; // 设置定回调函数和参数 timer.data = &my_timer; uv_timer_start(&timer, on_timer, 1000, 1000); // 运行事件循环 uv_run(loop, UV_RUN_DEFAULT); return 0; } ``` 在上面的代码中,我们定义了一个结构体 `my_timer_t`,其中包含一个定器结构体指针和一个整数参数。在创建定,我们使用 `uv_timer_init` 函数初始化定器结构体,然后将定器结构体指针和整数参数一起保存在自定义定器结构体 `my_timer_t` 中。在设置回调函数,我们将自定义定器结构体的指针 `&my_timer` 保存在定器结构体的 `data` 字段中,这样在回调函数中就可以使用这个结构体来获取定器参数。 当定触发回调函数 `on_timer` 被调用,其中参数 `timer` 是定器结构体指针。在回调函数中,我们通过 `timer->data` 来获取自定义定器结构体的指针,然后就可以使用这个结构体来获取定器参数了。 希望这个例子能够帮助您理解如何在定回调函数中传递参数。如果您有任何问题或疑问,请随和我交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值