单击"startButton“按钮后,它每5s触发一次执行" myCalculation”的计时器。问题:myCalculation方法的执行时间大约花费5-10秒来完成。
如何为定时器设定一个合适的时间间隔?(我认为将时间间隔设置为10s太长了,如果retrieveAndUpdateNews花费5s来完成程序将得到5s空闲)
在当前情况下,虽然myCalculation需要10 s才能完成,但定时器将跳过以执行retrieveAndUpdateNews并在稍后触发retrieveAndUpdateNews 5。
对于我的应用程序来说,这是一个重要的问题吗?耽误您时间,实在对不起。
-(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.
}发布于 2015-05-24 15:24:20
听起来,您真正想要的是,当用户按下按钮时,启动您的计时器,然后在服务器上处理并下载数据时停止它,然后在收到数据后重新启动它,以便您可以再次刷新。类似于:
- (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 =)。
发布于 2015-05-24 12:33:32
猜测计算所需的时间可能不是正确的方法(特别是考虑到不同设备的计算时间不同)。为什么不使用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();
});
}发布于 2015-05-24 15:58:43
为了避免这个问题,您可以使用
- (void)performSelector:(SEL)aSelector
withObject:(id)anArgument
afterDelay:(NSTimeInterval)delay在您的"retrieveAndUpdateNews“内部,也可以使用performSelector再次调用该方法。因此,它将进行递归调用。若要取消performSelector使用
- (void)cancelPreviousPerformRequestsWithTarget:(id)aTargethttps://stackoverflow.com/questions/30421380
复制相似问题