2011-05-25 101 views
0

我已經搜索了這個問題,唯一的提示是performSelectorOnMainThread解決方案。我這樣做了,但在for循環運行時視圖不會更新。循環後,進度值正確顯示 - 但這不是「進度」視圖的要點=)在for循環中更新UIProgressView

for循環位於控制器內。我調用一個方法來設置進度值:

CGFloat pr = 0.5; // this value is calculated 
[self performSelectorOnMainThread:@selector(loadingProgress:) withObject:[NSNumber numberWithFloat:pr] waitUntilDone:NO]; 

這是加載進度方法

-(void)loadingProgress:(NSNumber *)nProgress{ 
    NSLog(@"Set Progress to: %@", nProgress); 
    [[self progress] setProgress:[nProgress floatValue]]; 
} 

我也試圖通過使用這把法for循環到後臺線程方法的頂部:

if([NSThread isMainThread]) { 
     [self performSelectorInBackground:@selector(importData) withObject:nil]; 
     return; 
    } 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

也許有人可以幫助我這個。

+0

這是正確的,讓在另一個線程運行循環,你似乎更新進度視圖的方式也似乎是正確的。兩個問題:首先,你的NSLog是否顯示設置了正確的值?其次,你確定沒有其他東西阻塞主線程嗎? – DarkDust 2011-05-25 09:53:43

+0

在for循環完成後,NSLog消息被放出。值是正確的 - 但太遲了;) - 我不確定,其他東西是阻止主線程,但我可以說,我什麼也沒做,只是顯示視圖:) – cem 2011-05-25 09:57:59

+0

滑稽:日誌消息顯示WHILE for循環正在運行,UIProgressView的更新是在for循環運行之後進行的。 – cem 2011-05-25 10:08:42

回答

0
CGFloat pr = 0.5; // this value is calculated 
[self performSelectorInBackground:@selector(loadingProgress:) withObject:[NSNumber numberWithFloat:pr]]; 

試試這個設置進度值

+0

UI更新必須在主線程上完成。如果你想在後臺調用方法「loadingProgress」,你必須將setProgress嵌入到主線程中執行的塊中,這是毫無意義的。 – foOg 2013-06-26 14:05:30