2012-10-02 51 views
3

在我的基於文檔的應用程序中,我重寫了方法openDocument:在NSDocumentcontroller的子類中,以便我可以顯示自己的openPanel。我將選定的URL傳遞給openDocumentWithContentsOfURL方法:display:completionHandler :.我使用此代碼的電話:Modal NSAlert內部塊不顯示

[self openDocumentWithContentsOfURL:[chosenFiles objectAtIndex:i] display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) { 

    if (document == nil) 
    { 
     NSAlert* alert = [NSAlert alertWithError:error]; 
     [alert runModal]; 
    } 

}]; 

所以我想顯示傳遞的錯誤,如果nil返回作爲對文檔的引用。問題是,在我按下打開面板中的「打開」按鈕後,程序會「凍結」。然後我需要用Xcode中的「停止」按鈕手動停止程序。雖然沒有旋轉沙灘球出現。如果我對「[alert runModal]」行進行註釋,那麼程序不會再凍結,但當然不會顯示警報。

現在奇怪的事情:代碼工程有時。如果我從Xcode切換到瀏覽器並返回,然後再次運行該程序,它有時會完美地工作,並顯示錯誤。過了一段時間後,它再次停止工作。這是不可預知的,但大多數時候它不起作用。

這一切聽起來像是一種競爭條件。這當然與這個街區有什麼關係?但是我做錯了什麼?在主線程

runModel:

+3

也許runModel在主線程上。 [alert performSelectorOnMainThread:@selector(runModel)withObject:nil waitUntilDone:NO]; – mark

+0

你不想使用[alert show]? – Kyle

+1

@mark:謝謝,這似乎已修復它。由於錯誤相當難以預測,我還不完全確定。爲什麼有必要在主線程上明確執行它? – tungsten

回答

1

轉換我的評論一個答案。

[alert performSelectorOnMainThread:@selector(runModal) withObject:nil waitUntilDone:NO]; 

我覺得runModel需要在主線程中被調用,因爲它是了AppKit框架的一部分,它的estentially觸發UI圖形。我相信所有對AppKit框架或任何操縱圖形的方法的調用都需要在主線程上。

+1

我們如何獲得Runmodal的回報價值。根據按下按鈕的返回值,必須進一步顯示陽離子。請對此評論 –