2016-11-30 138 views
-2

我得到未更新(那支灰色)的進度條的問題。我得到這個方法來更新MainViewController.m進度條:iOS的進度條不更新

- (void)setProgress:(float)prog { 

    NSLog(@"Progressbar updated, value %f", prog); 
    self.progressBar.progress = prog; 
} 

當我使用調用它從類中(內MainViewController.m):

// in MainViewController.m 

[self setProgress:1.0]; 

一切是偉大的工作,該欄顯示藍色的進度,並且我得到了帶有值的NSLog輸出。

有了這個進度條,我希望可視化我在循環中執行的處理,該循環運行在不同的類(processing.m)中,將消息的進度發送到MainViewController我正在使用協議:

#import "progressProtocol.h" 

@interface MainViewController : UIViewController <progressProtocol> 
- (void)setProgress:(float)prog; 

@end 

並在processing.m:

// in processing.m 
[self.delegate setProgress:1.0]; 

當我通過經由協議發送消息調用setProgress方法我只能獲得正確的值,但在進度條的輸出的NSLog根據不移動到價值!?當我在方法內部設置斷點時,我可以看到該方法被調用,但進度條不移動。

我送約幾個hundert倍新值的消息在循環中 - 但在進度條一點變化都沒有,只是用的NSLog正確的值。任何想法?

+2

檢查什麼是prog'的'當您使用協議調用它的價值。 – Frankie

+5

是否在主線程上更新了條形圖?它必須。 – vadian

+0

@Frankie:我讓NSLog也打印出prog'NSLog(@「Progressbar updated,value%f」,prog)的值;'並且該值傳遞正確! – Hecot

回答

2

這聽起來像你正在做這樣的事情,在主線程:

int steps = 10000 
for (int step = 1; x < steps; x++) { 
    //Do something time-consuming that takes a few seconds. 
    viewController.setProgress((float)step/(float)steps) 
} 

這是行不通的。

在iOS的用戶界面更新僅發生在你的代碼返回和訪問事件循環。

如果你有一個循環,它在主線程一個耗時的任務,並不會返回,直到它完成,你的代碼更新進度指示器從來沒有得到一個機會來更新UI。

相反,你應該寫你的代碼,這樣做在後臺線程耗時的工作:

//Run the time-consuming loop on a background queue 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{ 
    int steps = 10000 
    for (int step = 1; x < steps; x++) { 
     //Do something time-consuming that takes a few seconds. 

     //As the loop progresses, send a message to update the progress 
     //indicator to the main thread. 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     viewController.setProgress((float)step/(float)steps) 
     } 
    } 
    } 
+0

我已經根據你的方案進行了設置,並且進度條現在正在更新,但是在處理完成一定百分比後,崩潰:'對象0x1008b6a00的malloc:***錯誤:對於釋放的對象 - 對象可能不正確的校驗和在被釋放之後進行修改。「之前的處理工作正常 - 您是否知道在哪裏查看導致崩潰的內容? – Hecot

+0

存在與多線程編程相關的各種潛在問題。在我看來,當你的長時間運行過程仍在運行時,某些東西會被釋放。最後用新代碼更新您的問題,解釋長時間運行的代碼在做什麼。 –