我在应用程序中使用分布式对象来提供微型身份验证代理程序和主应用程序之间的通信。主应用程序生成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;
}