我使用分布式对象在我的应用,以提供一个微小的认证代理程序和主应用程序之间的通信。主要的应用程序产生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

这似乎是不存在进入我的方法在同一线程上具有相同的地址的物体在三个不同的过程。显然我错过了分布式对象和这里线程的一些基本认识,但似乎像变魔术一样?

所以最终我得到了我的问题(S)

(一)有人可以解释这到底是怎么回事(即我怎样才能登录陈述如上)

(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;

}
有帮助吗?

解决方案

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]时喷出那些日志行而不是仅仅从远程过程的字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top