首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标c NSTimer间隔时间设置

目标c NSTimer间隔时间设置
EN

Stack Overflow用户
提问于 2015-05-24 08:13:12
回答 3查看 923关注 0票数 0

单击"startButton“按钮后,它每5s触发一次执行" myCalculation”的计时器。问题:myCalculation方法的执行时间大约花费5-10秒来完成。

如何为定时器设定一个合适的时间间隔?(我认为将时间间隔设置为10s太长了,如果retrieveAndUpdateNews花费5s来完成程序将得到5s空闲)

在当前情况下,虽然myCalculation需要10 s才能完成,但定时器将跳过以执行retrieveAndUpdateNews并在稍后触发retrieveAndUpdateNews 5。

对于我的应用程序来说,这是一个重要的问题吗?耽误您时间,实在对不起。

代码语言:javascript
复制
-(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.
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-24 15:24:20

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

代码语言:javascript
复制
- (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
EN

Stack Overflow用户

发布于 2015-05-24 12:33:32

猜测计算所需的时间可能不是正确的方法(特别是考虑到不同设备的计算时间不同)。为什么不使用gcd并在计算完成时接受“回调”呢?

下面是它的样子(假设您想在后台线程上执行计算):

代码语言:javascript
复制
- (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();
    });
}
票数 0
EN

Stack Overflow用户

发布于 2015-05-24 15:58:43

为了避免这个问题,您可以使用

代码语言:javascript
复制
- (void)performSelector:(SEL)aSelector
         withObject:(id)anArgument
         afterDelay:(NSTimeInterval)delay

在您的"retrieveAndUpdateNews“内部,也可以使用performSelector再次调用该方法。因此,它将进行递归调用。若要取消performSelector使用

代码语言:javascript
复制
- (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30421380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档