Frage

Ich möchte NSConnection / NSDistributedObject für Interprozess-Kommunikation verwenden. Ich würde der Kunde möchte in der Lage sein, den Fall zu behandeln, in denen der Server nur gelegentlich erreichbar ist.

Wie kann ich feststellen, ob eine Nachricht an den NSConnection senden, wird fehlschlagen oder ausgefallen? Zur Zeit, wenn mein Server (der Prozess, der das entfernte Objekt vended hat) stirbt, wird der Kunde crash , wenn es einen Schalter auf das entfernte Objekt sendet.

Im Idealfall würde Ich mag einen Wrapper für das Remote-Objekt haben, das kann träge instantiate (oder Reinstanziierung) die Verbindung und gibt einen Standardwert in dem Fall, dass die Verbindung nicht instanziiert werden kann, oder die Verbindung fehlgeschlagen ist. Ich weiß nicht wirklich den richtigen Weg, um dieses Ziel mit c zu tun.

Hier einige Pseudo-Code darstellt, diese Logik:

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

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
War es hilfreich?

Lösung

Leider ist die einzige Möglichkeit, einen Verbindungsfehler zu erkennen, ist eine Ausnahme-Handler zu verwenden, da es keine zuverlässige Art und Weise ist es, ein entferntes Objekt zu „fragen“, ob die Verbindung noch gültig ist. Zum Glück ist einfach:

//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
}

Andere Tipps

Wenn Ihr Server ordnungsgemäß dann quiting, ich bin von dem Verständnis, dass sie einen NSConnectionDidDieNotification veröffentlichen werde, da es die Verbindung schließt, so dass Sie Ihren Client wie diese registrieren können:

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

Vielleicht ist Ihr connectionDidDie:method einen Booleschen var einstellen könnte, dass Sie die Nachricht zu senden, bevor versucht überprüfen.

Ihre DO könnten eine Benachrichtigung es zu sagen, dass es angefangen hat (obwohl ich denke, es gibt auch Systemmeldungen für das, aber ich habe gerade erst begonnen, das Lernen über DOs) und man konnte in ähnlicher Weise davon den Starts benachrichtigt werden registrieren.

ich denke, Robs Antwort ist ein klarer ‚catch-alle‘ und Sie würden zu Sorgen über das Notification Center nicht brauchen, das durch auf den Server nicht rechtzeitig bekommt.

Ich habe ‚nicht gestorben‘ die unter Verwendung von Benachrichtigung es in meinem ersten DO App und ich hoffe, dass es Ihnen hilft.

Todd.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top