Распределенная архитектура объектов
Распределенные объекты работают при наличии серверного процесса, «продают» или обнародовали, объект, с которым могут соединиться другие клиентские процессы. Как только соединение сделано, клиентский процесс вызывает один из методов продаваемого объекта, как будто объект существовал в клиентском процессе — синтаксис не изменяется. Какао и система времени выполнения Objective C обрабатывают необходимую передачу данных между процессами.
Рисунок 1 показывает многие объекты, вовлеченные в распределенную систему объектов и как сообщение передается от клиентского процесса до серверного процесса. Процесс идет следующим образом.
Серверный процесс продает объект путем присоединения его к NSConnection
объект, содержащий NSPort
объект. Порт может быть зарегистрирован в NSPortNameServer
объект предоставить легкий доступ клиентами, желающими использовать продаваемый объект. Продаваемый объект может быть или реальным объектом, реализующим предоставленные методы или NSProtocolChecker
проксируйте объект, фильтрующий методы на основе протокола перед передающими методами к реальному объекту.
Клиентский процесс присоединяет к продаваемому объекту путем соединения его собственного NSConnection
возразите против сервера NSPort
объект (возможно полученный из сервера имен порта) и запрос прокси продаваемого объекта. Объект прокси является экземпляром NSDistantObject
. Клиент тогда обрабатывает NSDistantObject
возразите как реальный объект, отправляя сообщения обычно.
Когда клиентский процесс отправляет сообщение в NSDistantObject
объект, прокси получает сообщение Objective C в форме NSInvocation
объект и вперед это к NSConnection
объект. NSConnection
объект кодирует NSInvocation в NSPortMessage
объект, с помощью NSPortCoder
объект и передачи это к NSPort
объект соединился с NSPort
объект в серверном процессе. Порт клиента отправляет закодированные данные в порт сервера, декодирующий данные назад в NSPortMessage
объект. Сообщение порта тогда отправляется в NSConnection
объект, преобразовывающий его в NSInvocation
объект, с помощью NSPortCoder
объект. Вызов наконец диспетчеризируется как сообщение Objective C, отправленное в продаваемый объект. Любое возвращаемое значение от объекта пасуется назад через соединение и возвращается прозрачно к клиентскому процессу.
Если продаваемый объект является экземпляром NSProtocolChecker
, это тестирует, если сообщение Objective C, которое это получило, соответствует определенному протоколу, реализованному реальным объектом. Если сообщение находится в протоколе, средство проверки протокола передает сообщение к реальному объекту. Иначе, исключение повышено и возвращено к клиентскому процессу.
В то время как сообщение диспетчеризируется серверу и ожидает запроса удаленного метода для окончания выполнения, или путем возврата (с или без значения) или повышения исключения, клиентский процесс блокирует. Для методов без возвращаемого значения метод может быть объявлен с oneway
ключевое слово, чтобы указать, что сообщение должно быть отправлено асинхронно. Клиент не блокирует в этом случае и продолжает работать, как только отправляется сообщение.