Cocoa 使NSConnection暂停,直到找到注册名称的连接

Cocoa 使NSConnection暂停,直到找到注册名称的连接,cocoa,nsuserdefaults,distributed-objects,nsconnection,Cocoa,Nsuserdefaults,Distributed Objects,Nsconnection,有没有什么方法可以让NSConnection在建立连接时通过回调在运行循环中使用注册名称(例如单独的线程)搜索连接,或者在运行循环中调度连接?目前我正在使用 [NSConnection connectionWithRegisteredName:kRemotePreferencesDOName主机:nil] 但是如果没有找到连接,它只返回(我想是nil),而不是暂停或以其他方式进行回调。虽然这对于服务器-客户机关系来说是有意义的,但“服务器”和“客户机”都只是应用程序,它们可能在任何时候都处于打开

有没有什么方法可以让NSConnection在建立连接时通过回调在运行循环中使用注册名称(例如单独的线程)搜索连接,或者在运行循环中调度连接?目前我正在使用

[NSConnection connectionWithRegisteredName:kRemotePreferencesDOName主机:nil]

但是如果没有找到连接,它只返回(我想是nil),而不是暂停或以其他方式进行回调。虽然这对于服务器-客户机关系来说是有意义的,但“服务器”和“客户机”都只是应用程序,它们可能在任何时候都处于打开状态,也可能不处于打开状态,而不考虑其他应用程序,因此,当服务器启动(并注册其名称)时,客户机很可能处于打开状态并执行某些操作。此时,理想情况下会通知客户机/创建到服务器的连接


如果有帮助,这是系统首选项首选项窗格控制目标(仅后台)应用程序的NSUserDefaults的一种方法,当用户打开首选项窗格时,该应用程序可能正在运行,也可能没有运行。

只需使用while循环等待远程对象就绪。若应用程序在等待连接时要执行其他操作,请使用线程

NSDistantObject *pObj = nil;

while(nil == pObj)
{
    pObj = [[NSConnection rootProxyForConnectionWithRegisteredName:kRemotePreferencesDOName
                                                              host:nil] retain];

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.]];
}

只需使用while循环等待远程对象就绪。若应用程序在等待连接时要执行其他操作,请使用线程

NSDistantObject *pObj = nil;

while(nil == pObj)
{
    pObj = [[NSConnection rootProxyForConnectionWithRegisteredName:kRemotePreferencesDOName
                                                              host:nil] retain];

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.]];
}