Обнаружение / Восстановление сбоя 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, и я надеюсь, что оно поможет вам.

Тодд.

Другие вопросы по тегам