使用分布式对象销售对象并同步访问

时间:2009-09-26 15:25:46

标签: cocoa distributed-objects

我在我的应用程序中使用分布式对象来提供微型身份验证代理程序和主应用程序之间的通信。主应用程序生成NSTask,然后它将调用身份验证程序,然后该程序将回调主程序以获取一些用户凭据。我知道这听起来很复杂,但它必须以这种方式工作,因为ssh从SSH_ASKPATH中的程序获取密码的方式。

在我的主应用程序中,我有一个名为PasswordDialog的对象的实例,我按照以下方式提供;

PasswordDialog *vendedPasswordDialog=[[PasswordDialog alloc] init];  
[[NSConnection defaultConnection] setRootObject:vendedPasswordDialog];
[[NSConnection defaultConnection] registerName:@"MyConnectionName"]

当应用程序启动时会发生这种情况。

在身份验证代理中,我按如下方式回调此对象;

NSConnection *passwordDialogConnection = [NSConnection connectionWithRegisteredName:@"MyConnectionName" host:nil];

PasswordDialog *pdProxy = (PasswordDialog*)[passwordDialogConnection rootProxy];

NSString *responseStr = [pdProxy responseForPID:pidString host:hostnameString user:usernameString processInfo:[NSProcessInfo processInfo]];

问题在于,这不符合我的要求。如果同时执行多个身份验证代理,我发现他们都可以访问同一个对象并同时调用相同的方法。例如,如果我在“responseForPID”的开头放置一个日志语句,那么我得到这样的输出;

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PID endMethod 4872848
PID endMethod 4882384
PID endMethod 3618848

这似乎有三个不同的进程在具有相同地址的对象上的同一线程上输入我的方法。显然我在这里缺少对分布式对象和线程的一些基本理解,但这看起来像魔术?

所以最终我得到了我的问题

(a)有人可以解释这里发生了什么(例如我如何获得上述日志声明)

(b)显然我正在为我的目的错误地使用分布式对象。任何人都可以建议我如何正确地做到这一点。

感谢并感谢阅读到这个问题的结尾!


编辑: 只是为了澄清。我的“responseForPID”方法看起来像这样;

- (NSString*) responseForPID:(NSString*) pid host:(NSString*)hostname user:(NSString*) username processInfo:(NSProcessInfo*) info {

NSLog(@"beginMethod PID %@ on thread %@ for object %@",pid,[NSThread currentThread],self);

.... code to get the password 

NSLog(@"PID endMethod %@",pid);
return passwordString;

}

1 个答案:

答案 0 :(得分:1)

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PID都是不同的,表明线程正在不同的进程中执行。

所以,不,没有在单个线程上同时访问该方法。线程ID相同可能是巧合的;因为这三个进程相对简单并以相同的方式启动,所以线程恰好在每个进程中的相同地址处分配(或者,更可能的是,主要线程在应用程序初始化的性质上始终处于相同的地址)。

当您拨出这些日志行而不只是远程进程中的字符串时,请尝试打印[NSThread currentThread]