如何在不使用NSTimer的情况下每10秒触发一次方法?

时间:2011-04-18 15:52:44

标签: iphone objective-c cocoa-touch ios

我想每隔10秒调用一个方法,但我想使用NSTimer之外的其他方法。我可以用它做什么?

5 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

如果您不想使用计时器,您可以使用内部将使用NSOperationQueue的GCD,但在所有情况下都可以使用。例如:我有一个继承自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。

答案 2 :(得分:2)

您可以创建一个循环,将performSelector:withObject:afterDelay:设置afterDelay到10.0。

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

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

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

答案 3 :(得分:0)

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

如果您使用的是Cocos2D,请使用计划方法

下面的链接显示了两者:

How can I create a count down timer for cocos2d?

答案 4 :(得分:0)

最简单的方法是:

- (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];