2

私は NSXPC* ドキュメントを読みました。このドキュメントでは、提供されたサービスを可能な限りステートレスにするようアドバイスしています。サービスと呼び出し元のアプリはお互いをシングルトンと見なし、一度に実行されるサービスのインスタンスは 1 つだけなので、少なくとも私が読んだドキュメントと例にとっては良い考えです。これは、メソッドが本質的に非メンバー関数であることを意味します (C++ 用語を使用するため)。

なぜこれを回避したいのですか?ネットワーク コードを XPC に入れたい。XPC は複数のウィンドウを持つ GUI アプリで動作するため、複数の同時接続をサポートする必要があります。少なくとも直接的には、シングルトンでは機能しません。

ネットワーク API は C ベースで、主な状態型は custom へのポインターstructです。では、似たようなことをしてみませんか:

  1. 作成関数に値型などを返すようにしNSUUIDます。(プロセス間でポインターを渡すことは、悪い考えです。)
  2. サービスで、と API C ポインターの間のNSDictionary(またはstd::mapその他の) マッピングを作成します。NSUUID
  3. さまざまなサービス API が を受け取りUUID、ネットワーク API を使用するために C ポインターに変換します。

余談:トークンはランダムであるため、XPC サービスがクラッシュした場合、XPC の再起動後にメイン アプリにトークンが使用できなくなります。代わりに、URL (再起動するすべての情報が含まれる) を使用する必要があるかもしれません。しかし、2 つの接続がたまたま同じサーバーに接続されている場合、競合が発生する可能性があります。たぶん、URL/UUID ペアであるトークンとアイデアを組み合わせることができます。(UUID 値は、サービスによって返されるものから、メイン アプリによって提供されるものに移動します。)

これは、ステートフル XPC を実装する良い方法でしょうか?

4

1 に答える 1

0

有効期間の長いプロキシ オブジェクトで応答するメソッドをサービス インターフェイスに追加することができます。-[NSXPCInterface setInterface:forSelector:argumentIndex:ofReply:]を呼び出し、最後のパラメータに YES を渡すことで、これが発生するように調整できます。詳細はこちらから入手できます:

https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSXPCInterface_reference/#//apple_ref/occ/instm/NSXPCInterface/setInterface:forSelector:argumentIndex:ofReply :

于 2016-09-10T07:05:08.497 に答える