目标C - 函数(不知道如何解释这个)

时间:2012-11-04 00:21:02

标签: objective-c ios function syntax cocos2d-iphone

我正在开发一个带有Cocos2D的iOS应用程序,我遇到了很多情况,我想稍微延迟一些事情,所以我使用了一行代码:

[self scheduleOnce:@selector(do_something) delay:10];

do_something中发生的事情只有一行代码。 有没有办法让我在我计划的那一行定义函数?

当我以前用jQuery编程时,这与我想要实现的类似:

$("a").click(function() {
  alert("Hello world!");
});

看看function()是如何定义的?有没有办法在Objective-C中做到这一点? 还有,这有名字吗?为了将来的搜索?因为我发现这很难解释。

3 个答案:

答案 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)是一个在你的类中执行方法的命令。