3

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

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

发生的事情do_something只是一行代码。有没有办法让我在我安排它的那一行定义函数?

当我曾经使用 jQuery 进行编程时,这与我想要实现的目标相似:

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

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

4

3 回答 3

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 */
    })
});
于 2012-11-04T00:22:56.500 回答
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
           }]]];
于 2012-11-04T09:25:09.727 回答
0

我想您需要将方法“do_something”声明为

-(void)do_something {
    //Your implementation here
}

在这种情况下,您可以为 do_something 方法添加尽可能多的行。

@selector(do_something) 是在类中执行方法的命令。

于 2012-11-04T00:27:12.083 回答