Обнаружение / Восстановление сбоя NSConnection - PullRequest
2 голосов
/ 16 апреля 2010

Я хотел бы использовать 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 ]

2 голосов
/ 16 апреля 2010

К сожалению, единственный способ обнаружить сбой соединения - это использовать обработчик исключений, так как нет надежного способа «спросить» удаленный объект, если соединение все еще допустимо. К счастью, это просто:

//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
}
0 голосов
/ 12 мая 2012

Если ваш сервер завершает работу корректно, то, насколько я понимаю, он отправит NSConnectionDidDieNotification при закрытии соединения, чтобы вы могли зарегистрировать своего клиента следующим образом:

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

Возможно, ваш метод connectionDidDie: мог бы установить логическую переменную, которую вы можете проверить перед попыткой отправки сообщения.

Ваш DO может опубликовать уведомление о том, что оно запущено (хотя я думаю, что для этого есть и системные сообщения, но я только начал узнавать о DO), и вы также можете зарегистрироваться, чтобы получать уведомления о его запуске.

Я полагаю, что ответ Роба является определенным «всеобъемлющим», и вам не нужно беспокоиться о том, что центр уведомлений не успел вовремя связаться с сервером.

Я использовал уведомление «действительно умер» в своем первом приложении DO, и я надеюсь, что оно вам поможет.

Todd.

...