接收块的功能?

时间:2014-03-02 14:35:21

标签: ios objective-c

我需要特殊版本的dispatch_after。我需要它将参数传递给匿名函数,匿名函数在执行之前检查参数和类变量是否匹配。

我已经让它像这样工作:

  double delayInSeconds = 5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    int mod = self.invalidationCount;

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if(mod == self.invalidationCount)
            [self doAction:speed accelTime:accel];
    });

但是,这很脏。我必须在我班上需要它的地方复制这个块。

这就是我想要的:

有些事情:

double delayInSeconds = 5;
 dispatch_after_safe(delayInSeconds,self, ^(void){
                [self doAction:speed accelTime:accel];
        });

或者如果可能的话,以消息形式,所以我不必通过自我,但这没有问题......

基本上,dispatch_after_safe应该执行以下操作:

{
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

      int mod = parameterSelf.invalidationCount;

        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            if(mod == parameterSelf.invalidationCount)
                //execute the parameter block
        });
}

基本上,我需要一个包装器来处理我目前正在做的事情,但我是目标C的新手,我不太确定语法上如何做这样的事情。

这样做的全部意义在于,用户可以按Back键来停止任何排队的未来事件。

由于

1 个答案:

答案 0 :(得分:3)

你的意思是这样的:

void dispatch_after_safe(NSTimeInterval delay, id pmself, dispatch_block_t block) {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC);
    int mod = pmself.invalidationCount;
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if (mod == pmself.invalidationCount) {
            block();
        }
    });
}

(我建议用它应该使用的任何类对象替换类型id。)