Обработка ошибок соединения
NSConnection
объекты используют сетевые ресурсы, которые могут стать недоступными в любое время, или временно или постоянно.
Вследствие интенсивного сетевого трафика или занятого процесса, отдельные сообщения по соединению могут быть задержаны или проиграли, вызвав ошибку из-за тайм-аута. Ошибка из-за тайм-аута может произойти для исходящего сообщения, означая, что сообщение никогда не отправлялось его получателю, или для ответа на сообщение, успешно отправленное, означая или что сообщению не удалось достигнуть его получателя или что ответ не мог быть поставлен назад исходному отправителю. NSConnection
повышения NSPortTimeoutException
если после периода заданного времени или исходящее сообщение не отправляется или ответное сообщение, не получен. Вы устанавливаете продолжительности для этих тайм-аутов с NSConnection
методы экземпляра setRequestTimeout
: и setReplyTimeout:
. Приложение может установить обработчик исключений для критических сообщений, и если NSPortTimeoutException
повышен это может отправить сообщение снова, проверить, что сервер (или клиент) все еще работает, или примите то, что другие меры это должно восстановить.
В крайнем случае соединение может стать постоянно разъединенным. Когда процесс с помощью распределил катастрофические отказы объектов, например, объекты в том процессе, проданные к другим приложениям просто, прекращают существование. В таком случае, NSConnection
объекты, обрабатывающие те объекты, лишают законной силы себя и отправляют NSConnectionDidDieNotification
любым наблюдателям. Это уведомление позволяет объектам очистить их состояние как можно больше перед лицом ошибки.
Зарегистрироваться для NSConnectionDidDieNotification
, добавьте наблюдателя к значению по умолчанию NSNotificationCenter
:
[[NSNotificationCenter defaultCenter] addObserver:proxyUser |
selector:@selector(connectionDidDie:) |
name:NSConnectionDidDieNotification |
object:serverConnection]; |
Фрагмент выше регистрирует объект proxyUser получить a connectionDidDie:
обменивайтесь сообщениями, когда объект serverConnection в приложении отправит NSConnectionDidDieNotification
. Это позволяет ему выпускать любые прокси, которые это содержит и обрабатывать ошибку максимально корректно. См., что Уведомление Программирует Темы для получения дополнительной информации об уведомлениях.
Одно ограничение NSConnectionDidDieNotification
, однако, то, что NSConnection
объект, присоединенный к удаленному NSSocketPort
когда удаленный порт становится недопустимым, объект (отправить порт) не может обнаружить. Даже если удаленный порт находится на той же машине, это - истина. Поэтому NSConnection
объект не может отправить NSConnectionDidDieNotification
когда потеряно соединение. Вместо этого необходимо обнаружить ошибку из-за тайм-аута, когда следующее сообщение отправляется, и лишите законной силы NSSocketPort
возразите себе.
В случае клиент-серверной модели в чем сервер никогда не передает клиент, сервер может накопиться NSConnection
и NSSocketPort
объекты, когда выход клиентских приложений, явно не регистрируя из сервера. Сервер, поэтому, не понимает, что соединение может быть закрыто и выпущено, приведя к утечкам памяти. Если клиент был тих в течение чрезмерного промежутка времени, одно обходное решение для этой ситуации вовлекает клиент, продающий объект к серверу, позволяя серверу «проверить с помощью ping-запросов», или обмениваться сообщениями, клиент. Если клиенту не удается ответить, сервер может предположить, что клиент больше не жив, и он может закрыть соединение.