質問

インタープロセス通信には、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」通知を使用していますが、それがあなたに役立つことを願っています。

トッド。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top