【问题标题】:How can I trigger a method every 10 seconds without using NSTimer?如何在不使用 NSTimer 的情况下每 10 秒触发一次方法?
【发布时间】:2011-04-18 15:52:43
【问题描述】:

我想每 10 秒调用一次方法,但我想使用 NSTimer 以外的方法。我可以用什么来做到这一点?

【问题讨论】:

  • 为什么不想使用计时器? NSTimer 似乎是这个问题的完美解决方案。
  • 请注意,Xcode 是一个 IDE,而不是框架或语言,因此请不要用它标记您的问题并将其放在标题中,除非您询问 IDE 本身。

标签: iphone objective-c cocoa-touch ios


【解决方案1】:

我知道你说过你不想使用计时器,但只是为了确保你知道使用计时器会多么简单......

[NSTimer scheduledTimerWithTimeInterval:10.0
                                 target:self
                               selector:@selector(someMethod)
                               userInfo:nil
                                repeats:YES];

【讨论】:

  • 因为我希望球每十秒开始移动一次,但我认为我不能为相同的方法设置计时器
  • 我不认为这是一个问题 - 但即使是这样,只需创建调用 someMethodanotherMethod :)
【解决方案2】:

如果你不想使用计时器,你可以使用 GCD,它在内部会使用 NSOperationQueue,但在所有情况下都可以使用。例如:我有一个继承自 NSOperation 的类,所以上述方法不起作用,所以我选择了 GCD:

    double delayInSeconds = 3.0;      
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_after(popTime, queue, ^{
        [self methodYouWantToCall];  
    });

上面的代码每三秒调用一次方法methodYouWantToCall。

【讨论】:

  • "内部将使用 NSOperationQueue 的 GCD" 这是不正确的。反之亦然。
【解决方案3】:

您可以使用 performSelector:withObject:afterDelay: 将 afterDelay 设置为 10.0 创建一个循环。

我不建议这样做,使用 NSTimer。

- (void)callMeEvery10Seconds
{
    [self performSelector:@selector(callMeEvery10Seconds) 
               withObject:nil 
               afterDelay:10.0];

    // ... code comes here ...
}

【讨论】:

    【解决方案4】:

    如果不使用 Cocos2D,则必须使用 NSTimer 来执行此操作....

    如果你使用的是 Cocos2D,请使用 schedule 方法

    下面的链接显示了两者:

    How can I create a count down timer for cocos2d?

    【讨论】:

    • 如果您不使用 Cocos2D,为什么“必须”使用 NSTimer?
    【解决方案5】:

    最简单的方法是:

    - (void)scheduleLoopInSeconds:(NSTimeInterval)delayInSeconds
    {
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_after(popTime, queue, ^{
            [self callWhatEverMethodYouWant];
            [self shceduleLoopcaInSeconds:delayInSeconds];//set next iteration
        });
    
    }
    
    // now whenever you like call this, and it will be triggering  "callWhatEverMethodYouWant" every 10 secs.
    [self shceduleLoopcaInSeconds:10.0];
    

    【讨论】:

    • 哇,我已经测试了这个方法,它工作正常,但是使用 NSTimer 时大约 25% 的 CPU 使用率飙升至 99%!怎么回事?我猜这是由与调度块相关的开销调用的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2013-10-19
    相关资源
    最近更新 更多