2011-04-27 64 views
2

我有一個簡單的應用程序,它工作正常,直到我添加了一些代碼,在某個時候啓動了新線程,然後嘗試顯示來自該線程的警報。現在,只要用於顯示警報的代碼被擊中,應用程序就會崩潰。顯示UI元素,如來自多個線程的警報

UIAlertView * addAlert = [[UIAlertView alloc] initWithTitle:@"New alert" 
message:@"Example alert" 
delegate:nil 
cancelButtonTitle:@"Cancel", otherButtonTitles:@"OK", nil]; 
[addAlert show]; 
[addAlert release]; 

我的問題是:是否可以顯示UI元素,如來自iOS上多線程的警報?

回答

4

你絕對不希望顯示來自主線程以外的任何線程的警報(或任何與UI相關的)。我建議把你的警報代碼放在一個函數中並調用performSelectorOnMainThread調用之一。

- (void) showAlert 
{ 
    UIAlertView * addAlert = [[UIAlertView alloc] initWithTitle:@"New alert" 
     message:@"Example alert" 
     delegate:nil 
     cancelButtonTitle:@"Cancel", otherButtonTitles:@"OK", nil]; 
    [addAlert show]; 
    [addAlert release]; 
} 

// ... somewhere in the worker thread ... 
[self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO]; 
2

我敢肯定,主線程是唯一的線程,應該是處理UI識別/繪圖事物的屏幕。如果我在你的位置上,我會做什麼,要麼是使用KVO通知,要麼實現一些類所訂閱的協議。通過協議路由,當您到達代碼的警報部分時,只需要該線程調用其協議方法,就可以通過觸發委託功能來提醒訂閱類,並且您可以通過主線程。

希望有所幫助。

0

更好,更簡單,只是一種方法是用alertView調用performSelectorOnMainThread方法。 在你的情況下,嘗試這條線的

[addAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 

代替

[addAlert show]; 

它將調用Alertview的表演方法上的主線程。無需編寫任何額外的方法。