私は NSXPC* ドキュメントを読みました。このドキュメントでは、提供されたサービスを可能な限りステートレスにするようアドバイスしています。サービスと呼び出し元のアプリはお互いをシングルトンと見なし、一度に実行されるサービスのインスタンスは 1 つだけなので、少なくとも私が読んだドキュメントと例にとっては良い考えです。これは、メソッドが本質的に非メンバー関数であることを意味します (C++ 用語を使用するため)。
なぜこれを回避したいのですか?ネットワーク コードを XPC に入れたい。XPC は複数のウィンドウを持つ GUI アプリで動作するため、複数の同時接続をサポートする必要があります。少なくとも直接的には、シングルトンでは機能しません。
ネットワーク API は C ベースで、主な状態型は custom へのポインターstruct
です。では、似たようなことをしてみませんか:
- 作成関数に値型などを返すようにし
NSUUID
ます。(プロセス間でポインターを渡すことは、悪い考えです。) - サービスで、と API C ポインターの間の
NSDictionary
(またはstd::map
その他の) マッピングを作成します。NSUUID
- さまざまなサービス API が を受け取り
UUID
、ネットワーク API を使用するために C ポインターに変換します。
余談:トークンはランダムであるため、XPC サービスがクラッシュした場合、XPC の再起動後にメイン アプリにトークンが使用できなくなります。代わりに、URL (再起動するすべての情報が含まれる) を使用する必要があるかもしれません。しかし、2 つの接続がたまたま同じサーバーに接続されている場合、競合が発生する可能性があります。たぶん、URL/UUID ペアであるトークンとアイデアを組み合わせることができます。(UUID 値は、サービスによって返されるものから、メイン アプリによって提供されるものに移動します。)
これは、ステートフル XPC を実装する良い方法でしょうか?