NSTimer作为后台线程

时间:2014-07-10 08:24:23

标签: ios iphone multithreading thread-safety nstimer

我需要以固定的时间间隔ping服务器。我目前正在使用以下内容:

[NSTimer scheduledTimerWithTimeInterval:5.0f 
                                 target:[Socket getInstance] 
                               selector:@selector(sendHeartBeats) 
                               userInfo:nil 
                                repeats:YES];

以5秒的间隔调用函数sendHeartBeats

我是否需要在一个单独的线程上调用它,以便我的主线程不受影响?

3 个答案:

答案 0 :(得分:2)

NSTimer以及相关的NSRunLoop不会影响(也不了解)流程的线程行为。两者都只使用当前线程。

这意味着您必须自己关心线程。 NSTimerNSRunLoop一起使您有机会在给定的帖子上安排定时任务。

您可以在主线程上使用计时器或启动新线程,向其添加runloop并在该后台线程上启动计时器。

无论如何,在使用线程时,您必须了解线程安全问题。在这种情况下,这意味着使Socket类(单例?)线程安全,因为它可能在您的应用程序的其他地方使用。

答案 1 :(得分:1)

回答这个问题,答案是“不”,你不需要后台线程,以免用计时器破坏主线程。

至少对于NSTimer机制是正确的,但是如果计时器调用的方法花了很多时间做某事那么答案就是“是”,你应该在后台线程中调用它。但是,您需要在该后台线程中提供 runloop 才能使NSTimer正常工作,然后它变得复杂。

因此,如果要在后台线程中执行某些操作,我会避免使用NSTimer并执行以下操作:

while (YES) {
    [[NSThread currentThread] sleepForTimeInterval:5.0];
    if ([[NSThread currentThread] isCancelled])
        break;
    doThing();
}

启动此后台线程的线程将调用[thread cancel]以取消该线程。

答案 2 :(得分:0)

  

我需要在一个单独的线程上调用它,以便我的主线程   会不会受到影响?

不需要。

计时器与运行循环一起使用。要有效地使用计时器,您应该了解运行循环的运行方式 - 请参阅 NSRunLoop Threading Programming Guide