在触发之前停止'performSelector afterDelay'

时间:2011-04-06 08:14:12

标签: iphone objective-c

我使用以下代码在4秒延迟后开始重复NSTimer:

- (void)viewDidLoad {
    [self performSelector:@selector(startTimer) withObject:self afterDelay:4];
}
- (void)startTimer {
    NSTimer *mytimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
}
- (void)doSomething {
    NSLog(@"What up!");
}

问题是我可能需要在4秒钟之前取消调用startTimer。有办法做到这一点吗?我实际上更喜欢不首先使用performSelector(看起来很乱)。如果只有NSTimer有这样的东西......

  

NSTimer * mytimer = [NSTimer   scheduledTimerWithTimeInterval:1.0   afterDelay:4.0 target:self   选择器:@selector(doSomething的)   userInfo:nil重复:是];

...然后那将是完美的,因为我可以调用以下内容:

  

[myTimer invalidate];

非常感谢任何帮助或提示=)

P.S。我在NSObject类引用中找到了一个名为cancelPreviousPerformRequestsWithTarget的东西。似乎不是我可以从此代码运行的地方调用的方法。如果这回到了正确的轨道上,欢迎您的反馈!

3 个答案:

答案 0 :(得分:21)

Plz浏览SP帖子链接

Stopping a performSelector: from being performed

[NSObject cancelPreviousPerformRequestsWithTarget:self
                                         selector:@selector(sr)
                                           object:nil];

-performSelector的文档:withObject:afterDelay:指向取消排队执行请求的方法。

答案 1 :(得分:1)

[myTimer invalidate]不起作用? 只需跟踪您班级中的对象,或者在集中式商店中跟踪。 如果您这样做,您可以从任何地方访问您的计时器,并在需要时使其无效

答案 2 :(得分:0)

使用NSTimer解决问题。

self.autoTimer = [NSTimer timerWithTimeInterval:3.0 target:self
selector:@selector(connectionTimeout:) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:autoTimer
forMode:NSDefaultRunLoopMode];

并在您想要停止计时器时调用

 [self.autoTimer invalidate];

 self.autoTimer = nil;