我正在使用MBProgressHUD顯示進度指示器。當顯示指示器時被調用的代表是:檢查循環期間的持續時間
- (void)myTask {
while (self.show_progress == NO){
}
}
基本上,當它離開循環時它將關閉指示器。現在的問題是我想用這種方法做更多的事情。我想檢查指標已經旋轉了多久,如果已超過5秒鐘,我想重新加載請求。問題是我如何檢查這個?
這只是爲了防止應用程序等待無限的時間,以防萬一響應無法恢復或卡住某處。
我正在使用MBProgressHUD顯示進度指示器。當顯示指示器時被調用的代表是:檢查循環期間的持續時間
- (void)myTask {
while (self.show_progress == NO){
}
}
基本上,當它離開循環時它將關閉指示器。現在的問題是我想用這種方法做更多的事情。我想檢查指標已經旋轉了多久,如果已超過5秒鐘,我想重新加載請求。問題是我如何檢查這個?
這只是爲了防止應用程序等待無限的時間,以防萬一響應無法恢復或卡住某處。
如果我理解正確,您的代碼將等待,直到屬性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中等待信號。
我不熟悉MBProgressHUD,但總體而言,你可以做到以下幾點:只要你想檢查了多久
NSDate *startTime = [NSDate date];
然後:
當你第一次提出這項要求做它一直是:
NSTimeInterval timePassed = -[startTime timeIntervalSinceNow];
timePassed
將有值,以秒爲單位如何多久了,因爲你提出你的要求。也許你應該考慮使用NSTimer來做這件事:安排一個計時器,在你執行你的請求5秒後觸發,如果它觸發取消請求,但是如果你在計時器觸發之前收到一個響應,則使計時器失效。
當然,除了整個UI線程忙於等待外,什麼都做不了。可以使用'dispatch_after()'在5秒後處理重新啓動,並且很可能比'NSTimer'更清潔(沒有新的對象引用來管理,也不需要添加回調方法)。 – 2011-05-30 20:44:15
我走過類似的情況的方式是設置一個計時器。基本概念是當指標開始旋轉時啓動計時器。然後在指示器停止時使其無效。否則,如果持續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
方法中重新加載請求
在我提出請求之前/即,顯示進度我需要再次鎖定或做什麼? – aherlambang 2011-05-30 19:04:17
只需調用'[progressLock lock]; [progressLock unlockWithCondition:0];'如果您執行第二次請求,則將鎖重置爲初始狀態。 – 2011-05-30 20:23:45
這將是第一次初始化相同的條件([[NSConditionLock alloc] initWithCondition:0];)? – aherlambang 2011-05-30 21:01:21