Ios NSTimer作为背景线程
我需要定期ping服务器。我目前正在使用以下工具:Ios NSTimer作为背景线程,ios,iphone,multithreading,thread-safety,nstimer,Ios,Iphone,Multithreading,Thread Safety,Nstimer,我需要定期ping服务器。我目前正在使用以下工具: [NSTimer scheduledTimerWithTimeInterval:5.0f target:[Socket getInstance] selector:@selector(sendHeartBeats) userInfo:nil
[NSTimer scheduledTimerWithTimeInterval:5.0f
target:[Socket getInstance]
selector:@selector(sendHeartBeats)
userInfo:nil
repeats:YES];
此函数每隔5秒调用函数sendHeartBeats
我是否需要在单独的线程上调用此函数,以便我的主线程不会受到影响?
NSTimer
s以及相关的nsrunlop
,不会影响(也不会意识到)进程的线程行为。两者都只使用当前线程
这意味着您必须自己关心线程NSTimer
,与nsrunlop
结合使用,可以在给定线程上安排定时任务
您可以在主线程上使用计时器或启动新线程,向其添加runloop并在该后台线程上启动计时器
无论如何,在使用线程时,必须注意线程安全问题。在这种情况下,这意味着使
套接字
类(singleton?)线程安全,因为它可能在应用程序的其他位置使用。NSTimer
s以及相关的nsrunlop
,不会影响(也不会意识到)进程的线程行为。两者都只使用当前线程
这意味着您必须自己关心线程NSTimer
,与nsrunlop
结合使用,可以在给定线程上安排定时任务
您可以在主线程上使用计时器或启动新线程,向其添加runloop并在该后台线程上启动计时器
无论如何,在使用线程时,必须注意线程安全问题。在这种情况下,这意味着使Socket
class(singleton?)线程安全,因为它可能在应用程序的其他地方使用
我需要在一个单独的线程上调用它吗
不会受到影响吗
没必要
计时器与运行循环一起工作。为了有效地使用计时器,您应该了解运行循环是如何运行的,请参见和
我需要在一个单独的线程上调用它吗
不会受到影响吗
没必要
计时器与运行循环一起工作。为了有效地使用计时器,您应该了解运行循环是如何运行的,请参见和 好吧,要回答这个问题,答案是“不”,您不需要后台线程来避免用计时器中断主线程 至少对于
NSTimer
机制是这样的,但是如果计时器调用的方法花费大量时间做某事,那么答案是“是”,您应该在后台线程中调用它。但是,您需要在后台线程中提供一个runloop,以使NSTimer
正常工作,然后它就会变得复杂
因此,如果我要在后台线程中执行某些操作,我将避免使用NSTimer
,只需执行以下操作:
while (YES) {
[[NSThread currentThread] sleepForTimeInterval:5.0];
if ([[NSThread currentThread] isCancelled])
break;
doThing();
}
启动此后台线程的线程将调用
[thread cancel]
以取消该线程。要回答这个问题,答案是“否”,您不需要后台线程以避免使用计时器中断主线程
至少对于NSTimer
机制是这样的,但是如果计时器调用的方法花费大量时间做某事,那么答案是“是”,您应该在后台线程中调用它。但是,您需要在后台线程中提供一个runloop,以使NSTimer
正常工作,然后它就会变得复杂
因此,如果我要在后台线程中执行某些操作,我将避免使用NSTimer
,只需执行以下操作:
while (YES) {
[[NSThread currentThread] sleepForTimeInterval:5.0];
if ([[NSThread currentThread] isCancelled])
break;
doThing();
}
启动此后台线程的线程将调用
[thread cancel]
以取消该线程。如果不想在主线程上运行,请在此处检查如果不想在主线程上运行,请在此处检查