Pergunta

Gostaria de usar o NSCONNECTION/NSDISTIBEDOBOBJETO para comunicação interprocessante. Gostaria que o cliente fosse capaz de lidar com o caso em que o servidor só ocasionalmente é acessível.

Como posso determinar se o envio de uma mensagem para a NSCONNECTION falhará ou falhou? Atualmente, se meu servidor (o processo que vende o objeto remoto) morrer, o cliente irá batida Se ele enviar um seletor para o objeto remoto.

Idealmente, eu gostaria de ter um invólucro para o objeto remoto que pode instanciar preguiçosamente (ou reinstalar) a conexão e retornar um valor padrão no caso em que a conexão não pôde ser instanciada ou a conexão falhou. Eu realmente não sei a maneira correta de fazer isso usando o objetivo c.

Aqui está algum 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
Foi útil?

Solução

Infelizmente, a única maneira de detectar uma falha de conexão é usar um manipulador de exceção, pois não há uma maneira confiável de "perguntar" um objeto remoto se a conexão ainda for válida. Felizmente, isso é simples:

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

Outras dicas

Se o seu servidor estiver desistindo graciosamente, então eu sou do entendimento, que postará um NSConnectionDidDieNotification À medida que a conexão fecha, você pode registrar seu cliente assim:

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

Talvez o seu connectionDidDie:O método pode definir um var booleano que você pode verificar antes de tentar enviar a mensagem.

Seu DO pode postar uma notificação para dizer que ela foi iniciada (embora eu ache que também haja mensagens do sistema para isso, mas eu apenas comecei a aprender sobre fazer) e você poderia se registrar da mesma forma para ser notificado de sua startup.

Eu acho que a resposta de Rob é um 'Catch-All' definitivo e você não precisaria se preocupar com o fato de o centro de notificação não ter chegado ao servidor a tempo.

Eu tenho usado o notificação 'DID DIDE' no meu primeiro aplicativo e espero que isso ajude você.

Todd.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top