2011-09-06 78 views
2

在下面UIAlertView示例代碼延遲之後表演,但我需要馬上顯示出來爲什麼我的UIAlertView只會在延遲後出現?

//metoda zapisuje komentrz na serwerze 
-(void) saveAction { 

    UIAlertView *progressAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"imageGalleries.sendAction", @"") message:@" " delegate:self cancelButtonTitle:NSLocalizedString(@"alert.cancel", @"") otherButtonTitles:nil]; 

    [progressAlert addSubview:progressView]; 
    [progressAlert show]; 

    // some long performance instructions 
} 

- (void)loadView { 
    [super loadView]; 
    self.navigationItem.rightBarButtonItem = [NavButton buttonWithTitle:NSLocalizedString(@"sendImage.saveButtonTitle", @"") target:self action:@selector(saveAction)]; 
    progressView = [[UIProgressView alloc] initWithFrame: CGRectMake(30.0f, 80.0f - 26, 225.0f, 10.0f)]; 
} 

爲什麼UIAlertView不會立即顯示當我打電話saveAction

回答

10

如果「長期業績表現說明」下的報警代碼運行主線程,他們會阻止出現的警報。閱讀關於Cocoa運行循環的一些信息,這會讓事情變得更加清晰。 (基本上可以這麼說,你方法中的所有UI指令都不會立即執行 - 它們必須等待方法結束,然後主運行循環纔會啓動並運行它們。)

代碼可能最好是這樣的:

- (void) startSomeLongOperation { 
    [self createAndDisplayProgressSpinner]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
     // …do something that takes long… 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self dismissProgressSpinner]; 
     }); 
    }); 
} 

這將長操作移動到後臺,以便主線程可以繼續立即執行。

+0

我的觀點正是如此。在後臺執行長時間的操作。通知UI的進展。警報將立即顯示並且操作可以繼續不受阻礙。 +1 –

0

我不認爲你需要調用

[progressAlert addSubview:progressView]; 

除此之外,它真的應該只出現......

+0

它的工作原理,謝謝 –

1

您是否考慮過使用MBProgressHUD進行長期操作?它會將這些調用包裝到單獨的線程中,並且從功能和UI角度非常靈活

+0

這是更好的解決方案,但我必須用'UIAletView'處理 –

0

如果您在後臺線程中顯示警報,它也會有延遲。

+0

當我問這個問題時,我是初學者,現在我可以輕鬆解決這類問題,但感謝您的回答。 –

相關問題