Question

Je voudrais utiliser NSConnection / NSDistributedObject pour la communication interprocessus. Je voudrais que le client pour pouvoir gérer le cas où le serveur est accessible uniquement de temps en temps.

Comment puis-je déterminer si l'envoi d'un message à l'NSConnection échouera ou a échoué? Actuellement, si mon serveur (le processus qui a l'objet distant vendus dans) meurt, le client plantage si elle envoie un sélecteur à l'objet distant.

Idéalement, je voudrais avoir une enveloppe pour l'objet distant qui peut paresseusement instancier (ou reinstantiate) la connexion et renvoyer une valeur par défaut dans le cas où la connexion ne peut être instancié, ou la connexion a échoué. Je ne sais pas vraiment la bonne façon de faire de cet objectif en utilisant c.

Voici quelques pseudo-code représentant cette logique:

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

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
Était-ce utile?

La solution

Malheureusement, la seule façon de détecter une défaillance de connexion est d'utiliser un gestionnaire d'exception, car il n'y a aucun moyen fiable de « demander » un objet distant si la connexion est toujours valide. Heureusement, cela est 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
}

Autres conseils

Si votre serveur est Quiting gracieusement, je suis de la compréhension, qu'il posterai un NSConnectionDidDieNotification comme il est ferme de connexion pour que vous puissiez enregistrer votre client comme ceci:

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

Peut-être votre connectionDidDie:method pourrait définir une var booléenne que vous pouvez vérifier avant de tenter d'envoyer le message.

Votre DO pourrait poster une notification à dire qu'il a commencé (même si je pense qu'il ya aussi des messages système pour cela, mais je viens juste de commencer l'apprentissage de DO de) et vous pouvez inscrire De même pour être informé de la mise en service est tout.

Je suppose que la réponse de Rob est un certain « fourre-tout » et vous aurait pas besoin de vous soucier du centre de notification n'ayant pas reçu par le serveur dans le temps.

Je me sers de la notification « fait mourir » dans ma première application DO et je l'espère vous aide.

Todd.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top