2014-09-03 46 views
-1

以下代码有效地调度延迟的选择器调用,并且还有效地取消所有挂起的调度调用。不使用自我调用performSelector NSObject实例

[self performSelector:@selector(triggerUpdateForNSIndexPath:) 
      withObject:indexPath 
      afterDelay:triggerIn]; 

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 

此外,以下代码调度withObject的选择器并取消该特定的预定选择器withObject。

[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];将在它不相关时取消。这会引入一个我想避免的丑陋的错误。

+0

使用'NSTimer',你可以在必要时使'invalidate'失效吗? – trojanfoe 2014-09-03 14:56:51

+0

嘿@trojanfoe你其实是对的。我需要使用NSTimer。我将使用它并将预定的NSTimers保存在一个数组中,以便我可以轻松取消所有预定的NSTimers。我是iOS新手,所以我不明白有些事情是如何工作的。 :) – Jona 2014-09-03 16:10:31

回答

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:实例方法

aSelector
针对先前使用performSelector注册请求选择器: withObject:afterDelay:实例方法。

anArgument
针对先前使用performSelector注册请求的参数:withObject:afterDelay:实例方法。使用isEqual:来确定参数的相等性,因此该值不需要与最初传入的对象相同。通过零来匹配最初作为参数传递的nil请求。

讨论
所有执行的请求被取消具有相同的目标aTarget,参数作为anArgument,并选择为aSelector。此方法仅在当前运行循环中删除执行请求,而不是所有运行循环。

+0

是的,我使用这些调用来取消特定的预定选择器withObject。但我想在某些情况下取消特定选择器的所有预定选择器。我希望这是有道理的... – Jona 2014-09-03 15:02:24

0

我是iOS新手,所以要理解这个区域有点困难。我最终做的只是保留预定NSTimers的地图。然后我可以取消每个人或所有人。