1

私はカスタムのモーダルダイアログとして、一連のビューを実装したカスタムの多段階アカウント設定を持つCocoaアプリを持っています。カスタムモーダルダイアログとバックグラウンド操作

問題は、バックグラウンド操作(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

関連する問題