2009-11-15 120 views
1

我正在嘗試將一個進度表或其他「我現在正忙」通知添加到我的視圖層次結構中,然後再執行一些會阻止用戶界面的激烈計算。我的代碼看起來像這樣:視圖層次結構刷新時機

//create view 
[currentTopView addSubView:imBusyView]; 

//some initialization for the intense computation 
[computation startComputing]; 

不幸的是,我的進度計直到計算完成後才顯示。它看起來像視圖不會重新繪製,直到運行循環完成。我很確定setNeedsDisplay和setNeedsLayout也將等到運行循環完成。

如何讓視圖立即顯示?

回答

3

只有在代碼將控制權返回給運行循環時纔會進行重繪。因此,最簡單的方法是讓您安排零延遲的startComputing調用。

[computation performSelector:@selector(startComputing) withObject:nil afterDelay:0.0]; 

要知道,不過,除非你在另一個線程做你的計算,你將無法在更新UI:這樣的話,它將在接下來的運行循環迭代(重繪後右)期間執行計算。

+0

這幫助我解決了一個完全不相關的問題。謝謝! – 2011-03-15 23:34:28

1

如果你正在做繁重的計算,可能產生一個新的線程是一個好主意。

在這裏,我有一個activityIndi​​cator顯示,並在後臺線程開始大XMLPARSE操作:

- (void) setSearchParser { 
activityIndicator = [[ActivityIndicatorView alloc] initWithActivity]; 
[self.view addSubview:activityIndicator]; 
[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]]; 
} 

那麼getSearchResults方法:

- (void) getSearchResults: (SearchResultParser *) parser { 
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
[parser startParser]; 
[self performSelectorOnMainThread:@selector(searchResultsReady:) withObject:[parser data] waitUntilDone:NO]; 
[pool release]; 
} 

所以,首先創建一個新的線程:

[NSThread detachNewThreadSelector:@selector(getSearchResults:) toTarget:self withObject:[searchParser retain]]; 

這意味着getSearchResults中的所有代碼都將是在另一個線程上執行。 getSearchResults也傳遞了一個「searchParser」的參數,即一個只需startParse的大對象就可以開始調用它。

這是在getSearchResults中完成的。當[parser startParser]完成時,結果被傳回到名爲「searchResultsReady」的主線程方法,並釋放線程自動釋放池。

從我的解析器開始它完成的所有時間,灰色視圖覆蓋了屏幕上的一個activityIndi​​cator。

你可以有小activityIndi​​cator I類寫道:

-(id) initWithActivity { 
[self initWithFrame:[self bounds]]; 
[self setBackgroundColor:[UIColor blackColor]]; 
[self setAlpha:0.8]; 
activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
activityView.center = CGPointMake(160, 240); 
[self addSubview:activityView ]; 
[activityView startAnimating]; 
return self; 
} 

- (void) dealloc { 
[activityView release]; 
[super dealloc]; 
} 

希望它可以幫助你,即使線程似乎有點混亂,他們可以幫助使UI不凍結,這一點特別重要在iPhone上。

+0

謝謝布拉德。 我似乎無法得到客觀的C代碼格式正確:) – RickiG 2009-11-15 19:14:38

+0

謝謝你的冗長的迴應。對於我的情況,用戶將期待UI被阻止。 – SooDesuNe 2009-11-19 02:05:20