我正在使用MBProgressHUD来显示进度指示器。显示指标时调用的委托是:
- (void)myTask {
while (self.show_progress == NO){
}
}
基本上当它离开循环时它会解除指标。现在问题是我想在这个方法中做更多的事情。我想检查指示器旋转多长时间,如果超过5秒,那么我想重新加载请求。问题是如何检查?
这只是为了防止应用程序等待无限的时间,以防万一响应从未回复或卡在某处。
答案 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。等待信号。