Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSTimer作为背景线程_Ios_Iphone_Multithreading_Thread Safety_Nstimer - Fatal编程技术网

Ios NSTimer作为背景线程

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

我需要定期ping服务器。我目前正在使用以下工具:

[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]
以取消该线程。

如果不想在主线程上运行,请在此处检查如果不想在主线程上运行,请在此处检查