Обнаружение / Восстановление сбоя NSConnection
Я хотел бы использовать NSConnection/NSDistributedObject для межпроцессного взаимодействия. Я хотел бы, чтобы клиент мог обрабатывать случай, когда сервер доступен только изредка.
Как я могу определить, будет ли отправка сообщения в NSConnection неудачной или неудачной? В настоящее время, если мой сервер (процесс, который обработал удаленный объект) умрет, клиент потерпит крах, если он отправит селектор удаленному объекту.
В идеале я хотел бы иметь оболочку для удаленного объекта, которая может лениво создавать (или восстанавливать) соединение и возвращать значение по умолчанию в случае, когда соединение не может быть создано или соединение не удалось. Я действительно не знаю правильный способ сделать это, используя цель c.
Вот некоторый псевдокод, представляющий эту логику:
if myConnection is null:
instantiate myConnection
if MyConnection is null:
return defaultValue
try
return [myConnection someMethod]
catch
myConnection = null
return defaultValue
2 ответа
К сожалению, единственный способ обнаружить сбой соединения - это использовать обработчик исключений, поскольку нет надежного способа "спросить" удаленный объект о том, что соединение все еще допустимо. К счастью, это просто:
//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
}
Если ваш сервер завершает работу изящно, я понимаю, что он опубликует NSConnectionDidDieNotification
поскольку соединение закрывается, вы можете зарегистрировать своего клиента следующим образом:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];
Возможно твой connectionDidDie:
Метод может установить логическую переменную, которую вы можете проверить, прежде чем пытаться отправить сообщение.
Ваш DO может опубликовать уведомление о том, что он запущен (хотя я думаю, что для этого есть и системные сообщения, но я только начал узнавать о DO), и вы также можете зарегистрироваться, чтобы получать уведомления о его запуске.
Я предполагаю, что ответ Роба является определенным "всеобъемлющим", и вам не нужно беспокоиться о том, что центр уведомлений не успел вовремя связаться с сервером.
Я использовал уведомление "действительно умер" в своем первом приложении DO, и я надеюсь, что оно поможет вам.
Тодд.