2011-08-30 40 views
1

我已經打過電話可可:如何在執行後臺任務時運行模態窗口?

modalSession=[NSApp beginModalSessionForWindow:conversionWindow]; 
[NSApp runModalForWindow:conversionWindow]; 

爲了得到一個模式conversionWindow防止用戶與應用程序的其他部分進行交互,但這也似乎要禁止代碼執行。我的意思是,上面顯示的代碼之後的代碼根本不被執行。我怎樣才能解決這個問題?我敢肯定,這是可能的,因爲很多應用中表現出一定的進步,同時執行一些大任務,如視頻轉換等...

回答

6

,除非絕對必要,請不要使用應用程序模式窗口。如果可能,請使用表格。但是,如果你必須使用一個模式對話框,您可以通過給它運行一段時間的主要運行循環,而模態對話框打開時:

NSModalSession session = [NSApp beginModalSessionForWindow:[self window]]; 
int result = NSRunContinuesResponse; 

while (result == NSRunContinuesResponse) 
{ 
    //run the modal session 
    //once the modal window finishes, it will return a different result and break out of the loop 
    result = [NSApp runModalSession:session]; 

    //this gives the main run loop some time so your other code processes 
    [[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode]; 

    //do some other non-intensive task if necessary 
} 

[NSApp endModalSession:session]; 

如果您有需要主運行的觀點,這是非常有用的循環操作(想起WebView)。

但是,要明白模態會話就是這樣,之後的任何代碼都不會被執行,直到模態窗口關閉並且模態會話結束。這是不使用模態對話框的一個非常好的理由。

請注意,您不得在上述代碼的while循環中執行任何重要工作,因爲那樣您將阻止您的模式會話以及主運行循環,這會將您的應用程序變成沙灘球城市。

如果你想在後臺做一些實質性的事情,你必須使用某種形式的併發,比如使用NSOperation,GCD背景隊列或者純粹的後臺線程。

+0

感謝您的詳盡答覆。我想我會忘記模式窗口(我從來不喜歡它們)。 – Nickkk

3

你需要的,如果你想讓它同時運行啓動後臺「任務」在另一個線程模態窗口已啓動。但在大多數情況下,最好的解決方案是不使用模態窗口。

+0

另一種方法是簡單地告訴'conversionWindow',使自己的關鍵和秩序本身的前面。 –

+0

這也可能是最簡單的答案。無論如何,謝謝! – Nickkk