我已經閱讀了所有我能找到的相關問題,但仍然卡住了,所以我希望有人能夠發現我的推理錯誤。即使更新從主線程調用,UI也不會更新
我想定期更新一些UIView。爲了簡單起見,我將代碼縮減爲下面的代碼。總結:在viewDidLoad中,我調用了一個新的後臺線程方法。該方法在應該更新某個UILabel的主線程上調用一個方法。代碼似乎正常工作:後臺線程不是主線程,調用UILabel更新的方法在主線程上。在代碼:
在viewDidLoad中:
[self performSelectorInBackground:@selector(updateMeters) withObject:self];
這將創建一個新的後臺線程。我的方法updateMeters(爲簡單起見),現在看起來是這樣的:
if ([NSThread isMainThread]) { //this evaluates to FALSE, as it's supposed to
NSLog(@"Running on main, that's wrong!");
}
while (i < 10) {
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
//The code below yields the same result
// dispatch_async(dispatch_get_main_queue(), ^{
// [self updateUI];
// });
[NSThread sleepForTimeInterval: 1.05];
++i;
}
最後,updateUI做到了這一點:
if ([NSThread isMainThread]) { //Evaluates to TRUE; it's indeed on the main thread!
NSLog(@"main thread!");
} else {
NSLog(@"not main thread!");
}
NSLog(@"%f", someTimeDependentValue); //logs the value I want to update to the screen
label.text = [NSString stringWithFormat:@"%f", someTimeDependentValue]; //does not update
據我所知,這應該工作。但它不,不幸的是...註釋掉dispatch_async()
產生相同的結果。
什麼是「someTimeDependentValue」?一個浮點數我想.. – 2012-03-02 15:26:31
你試過用NSTimer嗎?也許在viewDidLoad中,你啓動了一個NSTimer。打勾時,讓它執行你的UI更新。在單個視圖中使用2個獨立的自引用過程有點令人困惑。 – Jeremy 2012-03-02 15:27:12
@RaphaelAyres是的。 – Tom 2012-03-02 15:40:11