NSTimer and NSRunLoop

6
我的应用程序使用CLLocationManager跟踪用户。在委托调用didUpdateToLocation中,我完成了保存他们位置的所有有趣的操作。然而,我需要一种方法来测试他们是否已经停止移动。这样我就可以停止记录位置并认为他们的旅行结束了。因此,我在CCLocationManager中加入了一个NSTimer,每次调用didUpdateToLocation时都会添加和删除它。这样它将在用户停止时被初始化,并且CLLocationManager停止被调用。
唯一让NSTimer工作的方法是:
[[NSRunLoop mainRunLoop] addTimer:userStoppedMovingTimer forMode:NSRunLoopCommonModes];

然后要将其移除:
[userStoppedMovingTimer invalidate];

我以前从未像这样添加定时器。有人能解释一下为什么吗?


如果您使用+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:创建计时器,这不应该是一个问题。 - Richard J. Ross III
1个回答

9
文档中可以得知,有三种方式可以创建定时器:
  1. 使用scheduledTimerWithTimeInterval:invocation:repeats:或者scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:类方法创建定时器,并在默认模式下将其安排到当前运行循环中。
  2. 使用timerWithTimeInterval:invocation:repeats:或者timerWithTimeInterval:target:selector:userInfo:repeats:类方法创建定时器对象,但不会在运行循环中自动启动。(在创建后,您必须通过调用相应的NSRunLoop对象的addTimer:forMode:方法手动将定时器添加到运行循环中。)
  3. 分配并初始化定时器,使用initWithFireDate:interval:target:selector:userInfo:repeats:方法。(在创建后,您必须通过调用相应的NSRunLoop对象的addTimer:forMode:方法手动将定时器添加到运行循环中。)
您之前可能使用的是选项1,现在正在使用选项2或3。

嗨@Tom,在我的情况下,我已经使用了运行循环,但是当我在iOS设备上安装我的应用程序时它不起作用。你有什么解决办法吗? - Yuvrajsinh Vala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接