在Objective-c中调用和取消选择器的适当方法?

时间:2014-01-30 05:26:07

标签: ios objective-c performselector

所以我有一个应用程序,当用户触摸某个对象时,我会通过延迟启动选择器。我不确定我是否想要或需要延迟,但我不确定最佳做法,也许是队列?无论如何,无论我现在有什么,这都是我需要的。

我现在有什么

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

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

用例#1:

  1. 用户触摸对象
  2. 用户2秒内不执行任何操作
  3. 呼叫选择器
  4. 用例#2:

    1. 用户触摸对象
    2. 用户触摸对象.5秒后(因此取消选择器调用)
    3. 用户触摸对象.3秒后(因此取消选择器调用)
    4. 用户触摸对象.9秒后(因此取消选择器调用)
    5. 用户2秒内未触及任何内容
    6. 呼叫选择器
    7. 如果感觉performSelectorcancelPrevious是hacky。我是否应该使用某种队列,然后每次用户再次触摸时清除队列?

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

1 个答案:

答案 0 :(得分:0)

我快速写了一些东西,希望它会有所帮助。每次开始命中时,计时器重置

@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];
    }
}