Как определить вызывающий объект при использовании Распределенных объектов (DO) в Objective-C? - PullRequest
2 голосов
/ 05 января 2012

Я использую Распределенные объекты (DO) в Objective-C.У меня есть «серверный» объект, который я продал в сети.Другие объекты в сети имеют прокси для моего объекта сервера и, таким образом, могут вызывать методы объекта сервера.Однако можно ли определить какую-либо информацию об объектах, вызывающих методы, на объекте сервера?То есть у меня есть много «клиентских» объектов, которые могут вызывать сервер, и я хотел бы различать эти объекты.Кроме того, я могу определить другие атрибуты об этих объектах, например, имя хоста, уникальный идентификатор?

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Я обнаружил, что наиболее эффективным решением этой проблемы является явная передача ссылки на вызывающий объект в качестве, скажем, первого параметра метода. Таким образом, вызывающий объект может быть легко идентифицирован и даже при необходимости отозван. Полученный аргумент имеет тип NSDistantObject *.

0 голосов
/ 07 января 2012

У меня была похожая проблема.Я обнаружил, что одним из возможных способов идентификации клиентов является передача им какого-либо токен-объекта на сервер как часть каждого вызова.На сервере вы можете сделать:

NSConnection* clientConnection = [passedTokenObject connectionForProxy];

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

В моем приложении у меня сначала были клиенты, которые делали «регистрационный» вызов, который я использовал для сбора информации.Мне нужно было о них.

Другая вещь, которая может оказаться полезной, - стать NSConnectionDelegate для NSConnection, который вы используете для продажи своего объекта сервера.Это даст вам доступ к следующим методам:

- (BOOL)connection:(NSConnection *)parentConnection shouldMakeNewConnection:(NSConnection *)newConnnection {
    //  You can inspect new connection being established here and maybe glean info about the client
    return YES;
}

- (BOOL) connection:(NSConnection *)c handleRequest:(NSDistantObjectRequest*)doReq {
    //  You get to see every method that is invoked here and can maybe glean info that you need.
    //  Returning NO means you're just snooping on the call and it will be handled in the normal way.
    return NO;
}

Доступных «инструментов» недостаточно, я нашел, и мне нужно было переработать мой реализованный API, чтобы помочь предоставить необходимую информацию.

...