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です。

4

1 に答える 1

0

次の電話の「ディスカッション」セクションをご覧ください[NSApplication beginSheet: modalForWindow: ...]

討論

このメソッドは、指定されたシートのモーダルイベントループを同期的に実行します。シートを表示し、キーを作成し、実行ループを開始して、そのシートのイベントを処理します。アプリケーションが実行ループにある間は、シートに関連付けられていない限り、他のイベント(マウス、キーボード、またはウィンドウを閉じるイベントを含む)に応答しません。また、モーダル実行ループに関連付けられていないタスク(タイマーの起動など)も実行しません。つまり、このメソッドは、イベントを処理してモーダルウィンドウに関連付けられたアクションメソッドにイベントをディスパッチするのに十分なCPU時間を消費します。

私にとって、これは、このモーダルセッションの実行中にバックグラウンドスレッドとタスクが実行されていないことを意味します。私は以前、自分のモーダルダイアログがWebサーバーにアクセスしようとしたときにこの問題に遭遇しました(正しく覚えていれば、登録の目的で)。

サーバーと非同期で通信する必要がある場合は、モーダルダイアログを使用しないのが最善の解決策です。モーダルダイアログを使用する必要がある場合は、モーダルシート間の通信を試みてください(つまり、ユーザーが「送信」を押したら、シートを終了してサーバーチャットを行い、次のステップのために次のシートを表示します)。

于 2012-02-16T13:17:04.760 に答える