检查循环期间的持续时间

时间:2011-05-30 17:51:45

标签: iphone objective-c

我正在使用MBProgressHUD来显示进度指示器。显示指标时调用的委托是:

- (void)myTask {
    while (self.show_progress == NO){

    }
}

基本上当它离开循环时它会解除指标。现在问题是我想在这个方法中做更多的事情。我想检查指示器旋转多长时间,如果超过5秒,那么我想重新加载请求。问题是如何检查?

这只是为了防止应用程序等待无限的时间,以防万一响应从未回复或卡在某处。

3 个答案:

答案 0 :(得分:2)

我不熟悉MBProgressHUD,但就一般而言,您可以执行以下操作:

当您第一次提出请求时:

NSDate *startTime = [NSDate date];

然后,只要你想查看它有多长时间:

NSTimeInterval timePassed = -[startTime timeIntervalSinceNow];

timePassed将以秒为单位显示自您提出请求以来的时间长度。也许你应该考虑使用NSTimer:安排一个计时器,它会在你执行请求后5秒触发,如果它触发取消请求,但是如果你在计时器触发之前收到响应,则会使计时器失效。

答案 1 :(得分:0)

我遇到类似情况的方法是设置一个计时器。基本概念是在指示器开始旋转时启动计时器。然后在指标停止时使其无效。否则,如果它持续5秒,执行你的方法。

所以在你的标题中,你需要

NSTimer *myTimer;

然后在实施中,当你启动指标旋转时,

[indicator startAnimating];
if (myTimer != nil) {
    [myTimer invalidate];
    myTimer = nil;
}
myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(reloadRequest) serInfo:nil repeats:NO];

当您停止指针旋转时,请发送[myTimer invalidate];myTimer = nil;。如果事先达到指定的时间,请在reloadRequest方法

中重新加载请求

答案 2 :(得分:0)

如果我理解正确,您的代码只会等到属性show_progress变为NO。我不知道你的代码为什么这样做,看起来有点不雅。如果你想保持这种方式,至少使用一个条件锁来防止100%的CPU使用:

准备这样的条件锁:

NSConditionLock *progressLock = [[NSConditionLock alloc] initWithCondition:0];

在你的第二个帖子中,一旦你的装载或其他任何结束,改变这样的条件:

[progressLock lock];
[progressLock unlockWithCondition:1];

在你的方法中,这样做:

- (void)myTask {
    NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:5];
    if ([progressLock lockWhenCondition: 1 beforeDate:timeoutDate) {
        // we aquired the lock, processing has finished
        [progressLock unlock];
    } else {
        // we didn't aquire the lock because the 5 seconds have passed
        // reload the request or do whatever you want to do
    }
}

此方法等待5秒,然后超时。它在5秒钟内不使用CPU,因为它在lockWhenCondition:beforeDate:call。等待信号。