1

我有一個可定製的多步驟賬戶設置的可可應用程序,我使用一組視圖實現了自定義模式對話框。自定義模式對話框和後臺操作

問題是後臺操作(獲取URL)似乎卡住了。我認爲這是因爲應用程序處於模態模式。

下面的代碼來啓動模態對話框:

[NSApp beginSheet:accountSetupController.window modalForWindow:self.window 
      modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; 

[accountSetupController beginAccountSetup]; // this later launches the background operation 
[NSApp runModalForWindow:accountSetupController.window]; 

NSApp endSheet:accountSetupController.window]; 

首先,是我的假設是正確的?即使應用程序運行模式,是否有辦法讓後臺操作繼續?

實際的後臺操作不在我的控制之下。它是一個帶有完成塊的外部API。

回答

0

看看你打電話的「討論」部分,以[NSApplication beginSheet: modalForWindow: ...]

討論

這種方法運行在指定的頁面 同步模態事件循環。它顯示工作表,使其成爲關鍵,開始運行 循環,並處理它的事件。 應用程序在運行 循環中時,除非它們與 工作表關聯,否則它不會響應任何其他事件(包括鼠標,鍵盤或窗口關閉事件)。它也不執行 沒有與模態運行循環相關聯的任何任務(例如觸發定時器)。換句話說,這種方法僅消耗足夠的CPU時間來處理事件,並將它們分派到與模態窗口相關的操作方法。

對我來說,這意味着,在此模式的會議即將後臺線程和任務沒有運行。我以前遇到過這個問題,用我自己的模式對話框嘗試訪問Web服務器(如果我沒有記錯的話,爲了註冊目的)。

如果您需要異步與服務器交談,最佳解決方案是不使用模態對話框。如果您必須使用模態對話框,請嘗試在模態表單之間進行通信(即,當用戶點擊「提交」,結束表格並完成服務器聊天,然後調出下一張表格以進行下一步操作)。

+0

好的,謝謝你確認我的假設。我可能會將對話框顯示爲單獨的實用程序窗口。從用戶體驗的角度來看,這不是一個想法,但它應該起作用。 – Mark 2012-02-16 13:35:06