如何取消多个延迟的performSelector调用

时间:2011-04-07 12:33:25

标签: ios objective-c cocoa-touch

我必须在限制中停止呼叫。

NSTimeInterval delay = 2;
for (NSString* sentence in sentences) {
   [sentenceHandler performSelector:@selector(parseSentence:)
                         withObject:sentence
                         afterDelay:delay];
   delay += 2;
}

如何从上面停止此通话?我试过了:

[NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler 
    selector:@selector(parseSentence) object:nil];

但没有效果?它是否只退出循环中的多个调用之一?

4 个答案:

答案 0 :(得分:13)

您有两种选择。您可以使用此功能删除对parseSentence:的所有排队调用:

[NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler];

或者你可以单独删除每一个(注意方法parseSentence之后的冒号“:”):

[NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler
                                         selector:@selector(parseSentence:)
                                           object:sentence];

答案 1 :(得分:1)

尝试使用@selector(parseSentence:)代替@selector(parseSentence)。这两者并不相同。此外,您必须指定object:。文档清楚地表明,如果您在原始nil电话中未通过nil,则无法通过performSelector:...

答案 2 :(得分:1)

我遇到了这个问题,确保performSelector中的字符串相同,cancelPreviousPerformRequestsWithTarget为我解决了这个问题。

答案 3 :(得分:0)

我遇到了一个类似的问题,我不知道我在不同的对象上安排了多个performSelector调用,所以“self”在每种情况下都不同。

我建议投入 NSLog(@“Self:%@”,self);之前您的每一段代码,例如:

for (NSString* sentence in sentences) {
    NSLog(@"Self: %@",self);
   [sentenceHandler performSelector:@selector(parseSentence:)
                         withObject:sentence
                         afterDelay:delay];
   delay += 2;
}

然后取消:

NSLog(@"Self: %@",self);
[NSObject cancelPreviousPerformRequestsWithTarget:sentenceHandler 
    selector:@selector(parseSentence) object:nil];

这将允许您确保排队并在正确的SELF上释放选择器。