NSTimer没有及时解雇

我试图连接到一个给定的IP地址端口。 一个问题是当build立一个不存在IP地址的连接时,write命令(如下):

NSData * imageRequest = [@"640" dataUsingEncoding: NSUTF8StringEncoding]; int image = [self.outputImageStream write:[imageRequest bytes] maxLength:[imageRequest length]]; 

它需要超过75秒的回应。 我尝试通过下面的方法调用来启动一个计时器:

 self.connectionTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(respondToTimer:)userInfo:nil repeats:NO]; 

它在我定义的1秒间隔内没有被调用。

有什么办法可以确保定时器在1秒内发射?

这可能会回答你关于NSTimer实时行为的问题 :

计时器不是一个实时的机制, 只有在添加了定时器的运行循环模式之一运行并且能够检查定时器的触发时间是否已经过去时才会触发。 由于典型的运行循环pipe理的各种input源,定时器的时间间隔的有效分辨率被限制在大约50-100毫秒的量级。 如果在长时间标注期间发生定时器的触发时间,或者运行循环处于未监视定时器的模式,定时器将在下次运行循环检查定时器时才触发。 因此,计时器触发的实际时间可能是预定的点火时间之后的相当长的一段时间。

您不指定如何安排NSTimer,但是如果您为NSRunLoopCommonModes而不是NSRunLoopDefaultModes进行安排,则可能会发现其性能得到了一些改进:

 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

如果这不能改善事情,那么你应该寻找更低层次的select。

尤其是,你可以看看CADisplayLink

CADisplayLink对象是一个计时器对象,它允许您的应用程序将其绘图与显示器的刷新率同步。

可以以与NSTimer非常相似的方式使用。

CADisplayLink的优点是链接到刷新率,所以它应该在1/60秒的时间间隔内提供非常可靠的行为。

使用CADisplayLink的示例:

 CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(respondToTimer)]; [displayLink setFrameInterval:60]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 

这将每60个刷新帧调用respondTimer ,即每秒一次。 既然你想让你的方法被调用,你可以使用:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self respondToTimer]; }); 

这对你来说可能更容易。 (当然,你可以用这个方法的全部实现来replace对[self respondToTimer]的调用)。