我必须在限制中停止呼叫。
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];
但没有效果?它是否只退出循环中的多个调用之一?
答案 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上释放选择器。