我需要以固定的时间间隔ping服务器。我目前正在使用以下内容:
[NSTimer scheduledTimerWithTimeInterval:5.0f
target:[Socket getInstance]
selector:@selector(sendHeartBeats)
userInfo:nil
repeats:YES];
以5秒的间隔调用函数sendHeartBeats
。
我是否需要在一个单独的线程上调用它,以便我的主线程不受影响?
答案 0 :(得分:2)
NSTimer
以及相关的NSRunLoop
不会影响(也不了解)流程的线程行为。两者都只使用当前线程。
这意味着您必须自己关心线程。 NSTimer
与NSRunLoop
一起使您有机会在给定的帖子上安排定时任务。
您可以在主线程上使用计时器或启动新线程,向其添加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 。