Domanda

Vorrei utilizzare connessione NSConnection / NSDistributedObject per la comunicazione tra processi. Vorrei il cliente sia in grado di gestire il caso in cui il server è raggiungibile solo occasionalmente.

Come è possibile determinare se l'invio di un messaggio alla connessione NSConnection non riuscirà o non è riuscito? Attualmente se il mio server (il processo che ha vended l'oggetto remoto) muore, il cliente sarà incidente se si invia un selettore per l'oggetto remoto.

Idealmente mi piacerebbe avere un wrapper per l'oggetto a distanza che possono pigramente instantiate (o reinstanziare) la connessione e restituire un valore di default nel caso in cui la connessione non poteva essere istanziato, o la connessione non è riuscita. Io non so davvero il modo corretto di farlo utilizzando obiettivo c.

Ecco alcuni pseudocodice che rappresenta questa logica:

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

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
È stato utile?

Soluzione

Purtroppo l'unico modo per rilevare un errore di connessione è quella di utilizzare un gestore di eccezioni, in quanto non v'è alcun modo affidabile per "chiedere" un oggetto remoto se la connessione è ancora valida. Per fortuna, questo è semplice:

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

Altri suggerimenti

Se il server è quiting grazia poi, io sono della comprensione, che sarà inviare un NSConnectionDidDieNotification come è connessione si chiude così si potrebbe registrare il cliente in questo modo:

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

Forse il vostro connectionDidDie:method potrebbe costituire un var booleano che è possibile controllare prima di tentare l'invio del messaggio.

Il tuo DO potrebbe inviare una notifica per dire che è iniziato (anche se penso che ci sono anche i messaggi di sistema per questo, ma ho appena iniziato a conoscere DO di) e si potrebbe analogamente registrarsi per ricevere una notifica di esso di avvio.

Credo che la risposta di Rob è un preciso 'catch-all' e non avrebbe bisogno di preoccuparsi per il centro di notifica non avendo ottenuto attraverso il server in tempo.

ho usato il 'è morto' di notifica nella mia prima app DO e spero che ti aiuta.

Todd.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top