Pregunta

Me gustaría utilizar NSConnection / NSDistributedObject para la comunicación entre procesos. Me gustaría que el cliente sea capaz de manejar el caso en que el servidor es accesible sólo ocasionalmente.

¿Cómo puedo determinar si van a enviar un mensaje a la NSConnection fallará o que ha fallado? Actualmente si mi servidor (el proceso que ha expendido el objeto remoto) muere, el cliente accidente si se envía un selector para el objeto remoto.

Lo ideal sería que me gustaría tener un contenedor para el objeto remoto que puede perezosamente instantiate (o reinstantiate) la conexión, y devolver un valor predeterminado en el caso en que la conexión no se pudo instancia, o la conexión ha fallado. No se sabe muy bien la forma correcta de hacer esto utilizando c objetivo.

Aquí hay algo de pseudocódigo que representa esta lógica:

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

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
¿Fue útil?

Solución

Por desgracia, la única manera de detectar un fallo de conexión es utilizar un gestor de excepciones, ya que no hay manera confiable de "pedir" un objeto remoto si la conexión es aún válida. Afortunadamente, esto es simple:

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

Otros consejos

Si su servidor está Quiting gracia entonces, soy de la comprensión, que va a publicar un NSConnectionDidDieNotification como se le cierra la conexión por lo que podría registrar su cliente de la siguiente manera:

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

Tal vez su connectionDidDie:method podría establecer un var booleano que se puede comprobar antes de intentar enviar el mensaje.

Su DO podría publicar una notificación a decir que ha iniciado (aunque creo que también hay indicaciones del sistema para eso, pero he hecho más que empezó a aprender sobre DO 's) y de manera similar podría registrarse para ser notificado de que de inicio.

Creo que la respuesta de Rob es un 'cajón de sastre' definido y que no tendría que preocuparse por el centro de notificación de haber no consiguió pasar al servidor en el tiempo.

He estado usando el 'sí murió' notificación en mi primera aplicación DO y espero que le ayuda.

Todd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top