0

我正在添加

[self performSelector:@selector(showLyrics) withObject:nil afterDelay:20];

但如果用户重新启动歌曲,则不应执行此选择器。所以我只想知道如何取消它。因为 20 秒后它会被调用,但我不希望这样,然后重新安排

 [self performSelector:@selector(showLyrics) withObject:nil afterDelay:20];

我有这么多

[self performSelector:@selector(showLyrics) withObject:nil afterDelay:2];

我想取消我之前安排的所有这些。

4

4 回答 4

3
[[NSRunLoop currentRunLoop] cancelPerformSelector:@selector(showLyrics) 
                                           target:self
                                         argument:nil];
于 2012-11-01T09:44:47.800 回答
2

您可以使用NSTimer而不是performSelector:withObject:afterDelay:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(showLyrics) userInfo:nil repeats:NO];

取消:

[timer invalidate];

但是您可能希望在每次开始之前使计时器无效,或者将计时器保留在数组中并遍历它们以取消所有计时器。

于 2012-11-01T09:41:00.097 回答
0

使用 anNSTimer并保存对它的引用而不是performSelector. AfaikperformSelector无法取消。 编辑:显然可以取消,请参阅 omz 的回答...

self.showLyricsTimer = [NSTimer scheduledTimerWithTimeInterval:20.0
                                                        target:self
                                                      selector:@selector(showLyrics)
                                                      userInfo:nil
                                                       repeats:NO];

要取消您使用的计时器:

[self.showLyricsTimer invalidate];

viewWillDisappear但是,当您的视图在回调中消失 fe 时,也要小心使计时器无效,因为NSTimer它保留了它的目标。

于 2012-11-01T09:43:02.217 回答
0

取消之前使用 performSelector:withObject:afterDelay 注册的执行请求:

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument

看来这就是你要找的或者你要找的~~

于 2014-06-27T10:14:54.180 回答