以下代码有效地安排延迟的选择器呼叫,并有效取消所有待处理的预定呼叫。
[self performSelector:@selector(triggerUpdateForNSIndexPath:)
withObject:indexPath
afterDelay:triggerIn];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
此外,以下代码为withObject计划选择器,并使用Object取消该特定的预定选择器。
[self performSelector:@selector(triggerUpdateForNSIndexPath:)
withObject:indexPath
afterDelay:triggerIn];
[NSObject cancelPreviousPerformRequestsWithTarget:self
selector:@selector(triggerUpdateForNSIndexPath:)
object:indexPath];
我的问题是,这是在目标上使用self
,这意味着triggerUpdateForNSIndexPath
将取消与我的选择器方法[NSObject cancelPreviousPerformRequestsWithTarget:self];
无关的任何其他预定调用。我尝试将self
更改为NSObject
实例,但从未触发选择器。
如何在不必知道确切withObject
的情况下控制预定选择器?对我来说,创建NSObject
实例以使用self
替换似乎是有道理的,但我想我已经离开...
基本上我担心的是,将来在我的代码中,我将调用performSelector并延迟特定选择器,并且调用[NSObject cancelPreviousPerformRequestsWithTarget:self];
将在它不相关时取消它。这将引入一个我想避免的丑陋的bug。
答案 0 :(得分:1)
除了cancelPreviousPerformRequestsWithTarget:
之外,NSObject还有cancelPreviousPerformRequestsWithTarget:selector:object:
方法。
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument
取消先前使用performSelector:withObject:afterDelay:
注册的请求。
<强>参数强>
aTarget
先前使用performSelector注册的请求的目标:withObject:afterDelay:instance method
aSelector
先前使用performSelector注册的请求的选择器:withObject:afterDelay:instance method。
anArgument
先前使用performSelector注册的请求的参数:withObject:afterDelay:instance方法。使用isEqual:确定参数相等性,因此该值不必与最初传递的对象相同。传递nil以匹配最初作为参数传递的nil请求。
<强>讨论强>
取消所有执行请求,其目标与 aTarget 相同,参数为 anArgument ,选择器为 aSelector 。此方法仅在当前运行循环中删除执行请求,而不是所有运行循环。
答案 1 :(得分:0)
我是iOS的新手,所以理解这个领域有点困难。我最终做的是简单地保留预定的NSTimers的地图。然后我可以取消每个人或所有人。