nscononection故障の検出/修復
-
27-09-2019 - |
質問
インタープロセス通信には、nsconnection/nsdistributedobjectを使用したいと思います。クライアントに、サーバーがたまにしか到達できないケースを処理できるようにしたいと思います。
nscononectionにメッセージを送信するかどうかを判断するにはどうすればよいですか?現在、私のサーバー(リモートオブジェクトを自動的に導入したプロセス)が死ぬと、クライアントは クラッシュ セレクターをリモートオブジェクトに送信する場合。
理想的には、リモートオブジェクトのラッパーを持ち、接続をゆっくりとインスタンス化(回復させる)ことができ、接続をインスタンス化できない場合、または接続が失敗した場合にデフォルト値を返すことができます。目的cを使用してこれを行う正しい方法を本当に知りません。
このロジックを表す擬似コードは次のとおりです。
if myConnection is null:
instantiate myConnection
if MyConnection is null:
return defaultValue
try
return [myConnection someMethod]
catch
myConnection = null
return defaultValue
解決
残念ながら、接続障害を検出する唯一の方法は、接続がまだ有効かどうかリモートオブジェクトを「尋ねる」信頼できる方法がないため、例外ハンドラーを使用することです。ありがたいことに、これは簡単です:
//get the distributed object
id <YourDOProtocol> remoteObject = (id <YourDOProtocol>)[NSConnection rootProxyForConnectionWithRegisteredName:@"YourRegisteredName" host:yourHost];
//call a method on the distributed object
@try
{
NSString* response = [remoteObject responseMethod];
//do something with response
}
@catch(NSException* e)
{
//the receiver is invalid, which occurs if the connection cannot be made
//handle error here
}
他のヒント
あなたのサーバーが優雅にやめている場合、私は理解しています、それは投稿するだろう NSConnectionDidDieNotification
接続が閉じるとクライアントを登録できるようになります。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];
おそらくあなた connectionDidDie:
メソッドは、メッセージの送信を試みる前に確認できるブールVARを設定できます。
あなたのDOは、それが開始されたことを言うように通知を投稿することができます(そのためのシステムメッセージもあると思いますが、私はDoについて学び始めたばかりです)。同様に、そのスタートアップを通知するために登録することもできます。
ロブの答えは明確な「キャッチオール」であり、通知センターが時間内にサーバーに届かないことを心配する必要はないと思います。
私は最初のdoアプリで「Did Die」通知を使用していますが、それがあなたに役立つことを願っています。
トッド。