我需要以不同的间隔执行某些任务(许多任务)。如何使用单个NStimer实例实现它,因为单个计时器会产生开销?
答案 0 :(得分:3)
我正在做这件事。 在我的appdelegate中,我有一个计时器和线程的方法(我为了简单起见删除了线程):
-(void)startupThreadsAndTimers{
//updatetime
timer = [NSTimer scheduledTimerWithTimeInterval:(1)
target:self
selector:@selector(updateTime)
userInfo:nil
repeats:YES];
}
我有一个定时器触发的方法
-(void)updateTime{
[[NSNotificationCenter defaultCenter] postNotificationName: @"PULSE" object: nil];
}
在appdelgate类的“awakefromnib”方法中我有这个:
[self startupThreads];
现在在viewcontrollers上的veiwdidload方法中需要订阅这个(更新时钟)我订阅了通知中心:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTimeLeft) name:@"PULSE" object:nil];
我有一个名为“updateTimeLeft”的方法
这非常有效,但我会重新审视它以便稍后使用线程获得一些性能。
要让事物以不同的间隔触发,您可以更改这些选择器以解析时间值,并让订阅视图控制器使用模数来决定要做什么。
即。
switch (timerValue % 15){
case 1:
[self someMethod];
break;
case 2:
[self someOtherMethod];
break;
}
希望这会有所帮助:)
答案 1 :(得分:2)
您可以使用NSNotificationCenter定义通知,并在特定时间调度通知,以便通知其他类并相应地执行某项任务...
答案 2 :(得分:1)
在app delegate中定义并使用UIApplication sharedApplication在其他地方访问它。 希望这有帮助
答案 3 :(得分:1)
我必须在我的iPhone应用程序中使用它,这就是我所做的:
#define kUpdateInterval(x) (iPerformanceTime % x == 0)
int iPerformanceTime;
-(void) mPerformanceGameUpdates {
if (iPerformanceTime == 0) { //Initialization
}
if (kUpdateInterval(1)) { //Every 1sec
}
if (kUpdateInterval(2)) { //Every 2sec
}
if (kUpdateInterval(5)) { //Every 5sec
}
if (kUpdateInterval(10)) { //Every 10sec
}
if (kUpdateInterval(15)) { //Every 15sec
}
if (kUpdateInterval(20)) { //Every 20sec
}
if (kUpdateInterval(25)) { //Every 25sec
}
iPerformanceTime ++;
}
//The method below helps you out a lot because it makes sure that your timer
//doesn't start again when it already has, making it screw up your game intervals
-(void) mPerformanceTmrGameUpdatesLoopShouldRun:(BOOL)bGameUpdatesShouldRun {
if (bGameUpdatesShouldRun == TRUE) {
if (bPerformanceGameUpdatesRunning == FALSE) {
tmrPerformanceGameUpdates = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(mPerformanceGameUpdates) userInfo:nil repeats:YES];
bPerformanceGameUpdatesRunning = TRUE;
}
} else if (bGameUpdatesShouldRun == FALSE) {
if (bPerformanceGameUpdatesRunning == TRUE) {
[tmrPerformanceGameUpdates invalidate];
bPerformanceGameUpdatesRunning = FALSE;
}
}
}
-(void) viewDidLoad {
[self mPerformanceTmrGameUpdatesLoopShouldRun:TRUE];
//TRUE makes it run, FALSE makes it stop
}
只需更改更新间隔即可开始使用!