我需要一个特殊版本的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
});
}
本质上,我需要一个包装器来完成当前的工作,但是我对 objective-c 还是陌生的,而且我不太确定在语法上如何做这样的事情。
这样做的全部目的是,用户可以按Back(后退),这应该停止所有排队的 future 事件。
谢谢
最佳答案
您的意思是这样的吗:
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
类型替换为应该使用的任何对象类。)关于ios - 占用一个块的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22128914/