私が取り組んでいるプロジェクト (Mac OS X アプリ) について、アーキテクチャ上の疑問があります。これは基本的に 2 つの要素で構成されています。バックグラウンドで実行されてデータを収集するデーモンと、収集されたデータを表示するために使用されるビューアーです。
デーモンはステータス バー (ドック アイコンなし) に表示され、ステータス バーからアクセスできる小さなメニューが含まれている必要があります。コア データ ストアにデータを保存します。メニュー項目の 1 つは、ビューアを開くリンクです。このビューアを開くと、通常のGUI アプリケーションが開始され、ドック アイコンとメニューバーが表示されます。ビューアーは、アプリケーション自体を開く (アイコンをダブルクリックする) ときにも開きます。
いくつかの実験の後、この機能を実現する最善の方法は、ビューアーを表すメイン アプリケーションとデーモンを表すヘルパー ユーティリティの 2 つのアプリケーションを作成することであることがわかりました。このようにした理由の 1 つは、値を即座に切り替えLSUIElement
てデーモン/ビューアーの状態を強制することができないためです。
このアーキテクチャについていくつか質問があります。
デーモンとビューア アプリケーションはどちらも、同じコア データ ストアを使用してデータを保存および取得します。マルチスレッド アプリケーションを使用する場合、
NSManagedObjectContext
データを正しく同期するには複数のオブジェクトが必要であることを知っています。複数のアプリケーションで同じコア データ ストアを同時に使用する場合はどうでしょうか。これは、競合やロックなどのリスクがなくても可能ですか? 一貫性を保証するにはどうすればよいですか?デーモンは、ビューアの起動時に常に起動する必要があります。これは、開いているすべてのプロセスを単純にループし、デーモンのバンドル識別子がリストされているかどうかを確認することで実現しました。そうでない場合、デーモンは
NSWorkspace
のを使用して開始されますlaunchApplication
。これはうまくいきます。ユーザーがデーモンを終了すると、ビューアも停止するはずです。デーモンの停止を視聴者に通知する最善の方法は何ですか? アクティブなプロセスを定期的にチェックし、デーモンがなくなった場合はビューアーを終了できますが、それは少し奇妙に聞こえます。ビューアーが閉じようとしているときに送信する何らかの通知を選択したいと思います。しかし、この通知はアプリ間で送信およびキャプチャする必要があるため、どの簡易通知サービスを利用できるかわかりません。何かご意見は?アプリケーションは Mac App Store で配布されるため、サンドボックス化されています。でアプリを開始すると、ターゲットアプリ
NSWorkspace
がソースと同じサンドボックス環境で実行されますが、同じサンドボックスで両方のアプリケーションを実行すると気分が良くなり、おそらくlaunchApplication
問題になるため、まったく問題はないと思います。しかし、次のシナリオを想像してみてください。デーモンはログイン時に ( を使用して) 自動的に開始され、ユーザーは Viewer.app をダブルクリックします。デーモンはすでに実行されているため (これも、アクティブなプロセスをループすることによってチェックされます)、開始されません。これで、デーモンとビューアが別のサンドボックスで実行されましたよね? これにより、設定、コア データ ストアなどに関する問題が発生しますか?SMLoginItemSetEnabled
基本設定に使用したいのですが
NSUserDefaults
、どうにかしてこのデータをデーモンとビューアーの間で交換できますか? ここでも、両方のアプリケーションが異なるバンドル ID を持ちます。
よろしくお願いします。