【问题标题】:Objective C - functions (not sure how to explain this one)Objective C - 函数(不知道如何解释这个)
【发布时间】:2012-11-04 00:21:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 */
        })
    });
    

    【讨论】:

    • 我将在接下来的几分钟内尝试一下。感谢您使用什么术语来指代它。这是我想从这个问题中得到的另一个主要内容。
    • 这似乎在重复执行,在这种情况下每 2 秒执行一次。我只希望它执行一次。
    • 它只执行一次。你把它放在一个重复的函数中。请参阅我的编辑,它显示了如何仅调度一次。
    • 我的错,你是对的。我把它放在一个重复的功能中。非常有用,谢谢!
    【解决方案2】:

    由于您使用的是 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
               }]]];
    

    【讨论】:

      【解决方案3】:

      我猜你需要将方法“do_something”声明为

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

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

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

      【讨论】:

      • 这就是我一直在做的事情。但是我有很多这样的东西,似乎没有必要为一行代码定义一个函数。
      • 您想在方法之前、之后或之间添加延迟吗?如果要在执行方法之前添加延迟,可以使用 [self performSelector:@selector(doSomething) withObject:nil afterDelay:0.5f];
      • 嗯,我想要的是一个“匿名选择器”,据我所知,它并不存在。我不想为 do_something 定义一个方法,因为它只是一行代码。
      • 我可以知道您当前的“do_something”方法中的“一行代码”吗? “一行代码”是否调用了另一种方法?如果是,您可以使用 [self performSelector:@selector(another_method) withObject:nil afterDelay:0.5f];如果“一行代码”是[self method_A];你可以使用 [self performSelector:@selector(method_A) withObject:nil afterDelay:0.5f];
      • Daniel 的解决方案效果很好。我的do_something 代表了许多不同的单行事物,从场景转换到在 CCSprite 上制作不可见。
      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2013-03-10
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多