我需要特殊版本的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键来停止任何排队的未来事件。
由于
答案 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
。)