不使用self调用performSelector NSObject实例

时间:2014-09-03 14:53:11

标签: ios objective-c

以下代码有效地安排延迟的选择器呼叫,并有效取消所有待处理的预定呼叫。

[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。

2 个答案:

答案 0 :(得分:1)

除了cancelPreviousPerformRequestsWithTarget:之外,NSObject还有cancelPreviousPerformRequestsWithTarget:selector:object:方法。

来自NSObject documentation

+ (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的地图。然后我可以取消每个人或所有人。