我正在开发一个带有Cocos2D的iOS应用程序,我遇到了很多情况,我想稍微延迟一些事情,所以我使用了一行代码:
[self scheduleOnce:@selector(do_something) delay:10];
do_something
中发生的事情只有一行代码。
有没有办法让我在我计划的那一行定义函数?
当我以前用jQuery编程时,这与我想要实现的类似:
$("a").click(function() {
alert("Hello world!");
});
看看function()是如何定义的?有没有办法在Objective-C中做到这一点? 还有,这有名字吗?为了将来的搜索?因为我发现这很难解释。
答案 0 :(得分:6)
您可以在一段时间后使用dispatch_after
执行阻止。
int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
/* code to be executed on the main queue after delay */
});
我会把它称为时间调度块。
编辑:如何只发送一次。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
/* code to be executed once */
});
所以在你的情况下:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
/* code to be executed on the main queue after delay */
})
});
答案 1 :(得分:1)
由于您正在使用Cocos2D,您还可以利用CCDelayTime方法并将其组合到CCSequence中以实现所需的效果。有点像:
id delayAction = [CCDelayTime actionWithDuration:10];
id callSelector = [CCCallFunc actionWithTarget: self selector: @selector(do_something)];
[self runAction:[CCSequence actionOne:delayAction two:callSelector]];
或者您也可以使用CCCallBlock,这样您就不必为do_something编写单独的方法,只需将其放在一个块中即可。
[self runAction:[CCSequence actionOne:delayAction two:[CCCallBlock actionWithBlock:^{
// do something here
}]]];
答案 2 :(得分:0)
我想你需要将方法“do_something”声明为
-(void)do_something {
//Your implementation here
}
在这种情况下,您可以为do_something方法添加尽可能多的行。
@selector(do_something)是一个在你的类中执行方法的命令。