Обнаружение / восстановление неисправности NSConnection
-
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.