如何正确处理 NSTimer 调用?
How to properly handle NSTimer calls?
我 运行 无法正确处理 NSTimer
。
在我的应用程序中,我有一个用户聊天选项(由于预算低的项目,我没有使用 XMPP,但聊天仅通过 API 调用进行)。我以 15 秒的时间间隔安排了一个计时器。如果有任何可用的新聊天,我会获取并更新聊天视图。
工作场景如下:
- 由于这是一个基于
UITabbar
的应用程序,用户将进入 "Chat" 选项卡。
- 用户将有一个他可以与之聊天的人的列表。
- 用户将 select 任何用户 – 将推送到聊天屏幕。
- 所有本地保存的聊天都将可见,并且将为新聊天进行 API 调用,在 API 调用成功(或错误)时,将安排一个计时器来同步聊天以 15 秒的时间间隔。
- 如果用户返回(弹出),在
viewDidDisappear:
方法中,我将使 (运行) 计时器无效。
在我的单元测试中,如果我持续推送和弹出 to/from 聊天屏幕,将会安排该计时器的多个实例。我怀疑,这是错误的。
我不确定我在做什么是否正确,但我需要你的帮助来了解完成我的功能的正确和正确的方法。我想这里不需要上面解释的代码。
这是我们通常使用 NSTimer
的方式。希望能帮助到你。
@implementation MainViewController{
NSTimer *myTimer
}
- (void)startTimer{
//Prevents multiple timers at the same time.
[myTimer invalidate];
myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void)update
{
//Stops the timer if the view in not on the screen
if (!(self.isViewLoaded && self.view.window)) {
[myTimer invalidate];
}
}
@end
首先,您为什么不探索推送通知选项?每 15 秒轮询一次服务器是一个糟糕的设计:-(.
其次,当谈到 NSTimer
时,从同一个线程启动和停止它们很重要。我建议您将计时器 start/stop 代码封装在下面的块中,始终确保您使用计时器处理主线程。
dispatch_async(dispatch_get_main_queue(), ^{
});
我 运行 无法正确处理 NSTimer
。
在我的应用程序中,我有一个用户聊天选项(由于预算低的项目,我没有使用 XMPP,但聊天仅通过 API 调用进行)。我以 15 秒的时间间隔安排了一个计时器。如果有任何可用的新聊天,我会获取并更新聊天视图。
工作场景如下:
- 由于这是一个基于
UITabbar
的应用程序,用户将进入 "Chat" 选项卡。 - 用户将有一个他可以与之聊天的人的列表。
- 用户将 select 任何用户 – 将推送到聊天屏幕。
- 所有本地保存的聊天都将可见,并且将为新聊天进行 API 调用,在 API 调用成功(或错误)时,将安排一个计时器来同步聊天以 15 秒的时间间隔。
- 如果用户返回(弹出),在
viewDidDisappear:
方法中,我将使 (运行) 计时器无效。
在我的单元测试中,如果我持续推送和弹出 to/from 聊天屏幕,将会安排该计时器的多个实例。我怀疑,这是错误的。
我不确定我在做什么是否正确,但我需要你的帮助来了解完成我的功能的正确和正确的方法。我想这里不需要上面解释的代码。
这是我们通常使用 NSTimer
的方式。希望能帮助到你。
@implementation MainViewController{
NSTimer *myTimer
}
- (void)startTimer{
//Prevents multiple timers at the same time.
[myTimer invalidate];
myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void)update
{
//Stops the timer if the view in not on the screen
if (!(self.isViewLoaded && self.view.window)) {
[myTimer invalidate];
}
}
@end
首先,您为什么不探索推送通知选项?每 15 秒轮询一次服务器是一个糟糕的设计:-(.
其次,当谈到 NSTimer
时,从同一个线程启动和停止它们很重要。我建议您将计时器 start/stop 代码封装在下面的块中,始终确保您使用计时器处理主线程。
dispatch_async(dispatch_get_main_queue(), ^{
});