Detectar/reparar a falha da NSCONNECTION
-
27-09-2019 - |
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
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.