【问题标题】:Appropriate way to call and cancel a selector in Objective-c?在Objective-c中调用和取消选择器的适当方法?
【发布时间】:2014-01-30 05:26:07
【问题描述】:

所以我有一个应用程序,当用户触摸某个对象时,我会通过延迟启动一个选择器。我不确定我想要或需要延迟,但不确定最佳实践,也许是排队?不管怎样,这就是我需要的,不管我现在有什么。

我现在拥有什么

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:self];
[self performSelector:@selector(doSomething) withObject:nil afterDelay:2.0];

当用户触摸某个对象时,我需要启动一个方法,但如果他/她再次触摸该对象,我不想调用该方法。

用例 #1:

  1. 用户触摸对象
  2. 用户在 2 秒内什么都不做
  3. 呼叫选择器

用例 #2:

  1. 然后用户触摸对象
  2. 用户在 0.5 秒后触摸对象(因此取消选择器调用)
  3. 用户在 0.3 秒后触摸对象(因此取消选择器调用)
  4. 用户在 0.9 秒后触摸对象(因此取消选择器调用)
  5. 用户在 2 秒内没有触摸任何东西
  6. 呼叫选择器

如果觉得 performSelectorcancelPrevious 很老套。我是否应该使用某种队列,然后每次用户再次触摸时清除队列?

或者我应该使用计时器,每次用户触摸它时重新启动计时器?

【问题讨论】:

  • 虽然我认为计时器是 peformselector 在下面做的。
  • 我建议您使用 timer 和一些 boolean flag。该方法在两秒后触发,即当计时器关闭时。
  • 是的,你是对的。使用在每次点击时切换其值的布尔标志。并且仅当标志为真时才在方法中执行操作。

标签: ios objective-c performselector


【解决方案1】:

我写了一些东西,希望它会有所帮助。每次启动时,计时器都会重置

@interface ViewController ()
{
    NSTimer *timer;
    NSInteger seconds;
}
@end

- (IBAction)start:(id)sender
{
    seconds = 5;
    [timer invalidate];
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(execute) userInfo:nil repeats:YES];
}

- (void)execute
{
    if(seconds > 0) {
        NSLog(@"seconds: %li", (long)seconds);
        seconds--;
    }
    else {
        NSLog(@"fire");
        [timer invalidate];
    }
}

【讨论】:

  • 好的,所以经过一些研究 performSelector afterDelay 在下面创建了一个 NSTimer,所以它就是这样做的。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多