2

プロセス間通信にNSConnection/NSDistributedObjectを使用したいと思います。サーバーにたまにしか到達できない場合にクライアントが対応できるようにしたいと思います。

NSConnectionへのメッセージの送信が失敗するか失敗したかを判断するにはどうすればよいですか?現在、サーバー(リモートオブジェクトを販売しているプロセス)が停止した場合、クライアントがセレクターをリモートオブジェクトに送信すると、クライアントがクラッシュします。

理想的には、接続を遅延インスタンス化(または再インスタンス化)し、接続をインスタンス化できなかった場合や接続が失敗した場合にデフォルト値を返すことができるリモートオブジェクトのラッパーが必要です。私はObjectivecを使用してこれを行う正しい方法を本当に知りません。

このロジックを表すいくつかの擬似コードは次のとおりです。

if myConnection is null:
    instantiate myConnection
    if MyConnection is null:
        return defaultValue

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
4

2 に答える 2

2

残念ながら、接続の失敗を検出する唯一の方法は、例外ハンドラーを使用することです。接続がまだ有効であるかどうかをリモートオブジェクトに「尋ねる」信頼できる方法がないためです。ありがたいことに、これは簡単です。

//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
}
于 2010-04-16T01:13:54.267 に答える
0

サーバーが正常に終了している場合は、接続が閉じるとサーバーが投稿するNSConnectionDidDieNotificationので、次のようにクライアントを登録できることを理解しています。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];

おそらく、あなたのconnectionDidDie:メソッドは、メッセージを送信する前にチェックできるブール変数を設定することができます。

あなたのDOは、それが開始されたことを知らせる通知を投稿することができ(システムメッセージもあると思いますが、私はDOについて学び始めたばかりです)、同様に登録して、DOの起動を通知することができます。

ロブの答えは間違いなく「キャッチオール」だと思います。通知センターが時間内にサーバーに到達しなかったことを心配する必要はありません。

私は最初のDOアプリで「diddie」通知を使用してきましたが、お役に立てば幸いです。

トッド。

于 2012-05-12T09:03:59.047 に答える