2011-05-30 76 views
0

我正在使用MBProgressHUD顯示進度指示器。當顯示指示器時被調用的代表是:檢查循環期間的持續時間

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

    } 
} 

基本上,當它離開循環時它將關閉指示器。現在的問題是我想用這種方法做更多的事情。我想檢查指標已經旋轉了多久,如果已超過5秒鐘,我想重新加載請求。問題是我如何檢查這個?

這只是爲了防止應用程序等待無限的時間,以防萬一響應無法恢復或卡住某處。

回答

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中等待信號。

+0

在我提出請求之前/即,顯示進度我需要再次鎖定或做什麼? – aherlambang 2011-05-30 19:04:17

+0

只需調用'[progressLock lock]; [progressLock unlockWithCondition:0];'如果您執行第二次請求,則將鎖重置爲初始狀態。 – 2011-05-30 20:23:45

+0

這將是第一次初始化相同的條件([[NSConditionLock alloc] initWithCondition:0];)? – aherlambang 2011-05-30 21:01:21

2

我不熟悉MBProgressHUD,但總體而言,你可以做到以下幾點:只要你想檢查了多久

NSDate *startTime = [NSDate date]; 

然後:

當你第一次提出這項要求做它一直是:

NSTimeInterval timePassed = -[startTime timeIntervalSinceNow]; 

timePassed將有值,以秒爲單位如何多久了,因爲你提出你的要求。也許你應該考慮使用NSTimer來做這件事:安排一個計時器,在你執行你的請求5秒後觸發,如果它觸發取消請求,但是如果你在計時器觸發之前收到一個響應,則使計時器失效。

+0

當然,除了整個UI線程忙於等待外,什麼都做不了。可以使用'dispatch_after()'在5秒後處理重新啓動,並且很可能比'NSTimer'更清潔(沒有新的對象引用來管理,也不需要添加回調方法)。 – 2011-05-30 20:44:15

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方法中重新加載請求