如何正确处理NSTimer调用?

时间:2015-10-01 13:57:09

标签: ios objective-c nstimer

我遇到的情况是我无法正确处理NSTimer

在我的应用程序中,我可以选择用户聊天(由于预算项目较少,我没有使用XMPP,但聊天只能通过API调用)。我以15秒的时间间隔安排了一个计时器。如果有任何新聊天可用,我会得到它并更新聊天视图。

以下是工作方案:

  1. 由于这是基于UITabbar的应用,用户将进入“聊天”标签。
  2. 用户将有一个他可以与之聊天的人员列表。
  3. 用户将选择任何用户 - 将推送到聊天屏幕。
  4. 如果所有本地保存的聊天都可见,并且将对新聊天进行API调用,则在API调用成功(或错误)时,将安排定时器以15秒的时间间隔同步聊天。
  5. 如果用户返回(弹出),在viewDidDisappear:方法中,我正在使(正在运行的)计时器无效。
  6. 在我的单元测试中,如果我继续推动&弹出/从聊天屏幕弹出,将有多个该计时器的实例将被安排。我怀疑,这是错误的。

    我不确定我在做什么是正确的,但我需要你的帮助才能理解正确和正确的方法来完成我的功能。我想这里不需要上面解释的代码。

2 个答案:

答案 0 :(得分:1)

首先,你为什么不探索推送通知的选项?每15秒轮询服务器是一个糟糕的设计: - (

其次,当谈到NSTimer时,从同一个线程开始和停止它们很重要。我建议你在下面的块中封装你的计时器启动/停止代码,总是确保你用你的计时器处理主线程。

dispatch_async(dispatch_get_main_queue(), ^{

});

答案 1 :(得分:0)

这是通常与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