目标c NSTimer间隔时间设置

时间:2015-05-24 08:13:13

标签: objective-c cocoa timer nstimer

" startButton"单击按钮,它会触发计时器以执行" myCalculation"每隔5秒。 问题:myCalculation方法的执行时间大约需要5到10秒才能完成

Q1。如何为计时器设置合适的时间间隔? (我认为将时间间隔设置为10s太长,如果retrieveAndUpdateNews花费5s完成,程序将空闲5s)

在目前的情况下,尽管myCalculation需要10秒才能完成,但计时器将跳过执行retrieveAndUpdateNews并在稍后触发retrieveAndUpdateNews。

问题2.这对我的应用来说是一个潜在的问题吗? 谢谢你的时间。

-(IBAction) startButton : (id)sender{
NSTimer * myTimer;
timer = [NSTimer scheduledTimerWithTimeInterval:5 
      target:self
      selector:@selector(retrieveAndUpdateNews)  
      userInfo:nil repeats:YES];                                   
}                      

-(void)retrieveAndUpdateNews{
    //some calculation spend  5 - 10  sec.
}

3 个答案:

答案 0 :(得分:1)

听起来你真正想要的是当用户按下按钮然后在服务器上处理并下载数据时停止它,然后在收到数据后重新启动它,这样你就可以再次刷新。类似的东西:

- (IBAction) startButton:(id)sender {
    [self beginDownloadCycle];
}

- (void)beginDownloadCycle {
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:5 
      target:self
      selector:@selector(retrieveAndUpdateNews)  
      userInfo:nil
      repeats:NO]; 
}                    

- (void)retrieveAndUpdateNews {
    // some calculation spend  5 - 10  sec with completion block.
    [... :^() {
        [self beginDownloadCycle];
    }];
}

请注意,应保留计时器,以便您可以根据需要取消计时器,以便了解正在进行的操作(因此self.myTimer =)。

答案 1 :(得分:0)

可能没有正确的方法来猜测你的计算花费多少时间(特别是因为它会因不同的设备而异)。为什么不利用gcd并收到"回调"究竟什么时候计算完成了?

以下是它的外观(假设你想在后台线程上执行计算):

- (IBAction)startButton:(id)sender {

    [self doSomethingWithCompletionCallback:^{
        [self retrieveAndUpdateNews];
    }];
}

- (void)doSomethingWithCompletionCallback:(void (^)(void))callback {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    /// do some work
        callback();
    });
}

答案 2 :(得分:0)

要避免此问题,您可以使用

- (void)performSelector:(SEL)aSelector
         withObject:(id)anArgument
         afterDelay:(NSTimeInterval)delay

同样在“retrieveAndUpdateNews”中,使用performSelector再次调用该方法。所以它将进行递归调用。要取消performSelector,请使用

- (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget