Обнаружение / восстановление неисправности NSConnection

StackOverflow https://stackoverflow.com/questions/2649059

  •  27-09-2019
  •  | 
  •  

Вопрос

Я хотел бы использовать NSConnection / NSDistribibedObject для связи интерпретирования. Я хотел бы, чтобы клиент мог справиться с случаем, когда сервер только изредка достижима.

Как я могу определить, не удастся отправка сообщения на NSConnection или не удалось? В настоящее время, если мой сервер (процесс, который пострадал от удаленного объекта) умирает, клиент будет крушение Если он отправляет селектор на удаленный объект.

В идеале я хотел бы иметь обертку для удаленного объекта, который может лечить соединение, и вернуть значение по умолчанию в случае, когда соединение не может быть создано, или соединение не удалось. Я действительно не знаю правильный способ сделать это, используя объективную C.

Вот какой-то псевдокод, представляющий эту логику:

if myConnection is null:
    instantiate myConnection
    if MyConnection is null:
        return defaultValue

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
Это было полезно?

Решение

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

//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:Метод может установить логическое значение VAR, которое вы можете проверить перед попыткой отправки сообщения.

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

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

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

Todd.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top