检测/修复NSConnection故障

时间:2010-04-15 21:19:59

标签: objective-c cocoa nsconnection

我想使用NSConnection / NSDistributedObject进行进程间通信。我希望客户端能够处理只是偶尔可以访问服务器的情况。

如何确定向NSConnection发送消息是否会失败或失败?目前,如果我的服务器(已经出售远程对象的进程)死亡,客户端将崩溃,如果它将选择器发送到远程对象。

理想情况下,我希望有一个远程对象的包装器,它可以懒惰地实例化(或重新实例化)连接,并在无法实例化连接或连接失败的情况下返回默认值。我真的不知道使用目标c的正确方法。

这里有一些代表这种逻辑的伪代码:

if myConnection is null:
    instantiate myConnection
    if MyConnection is null:
        return defaultValue

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue

2 个答案:

答案 0 :(得分:2)

不幸的是,检测连接失败的唯一方法是使用异常处理程序,因为如果连接仍然有效,则没有可靠的方法来“询问”远程对象。谢天谢地,这很简单:

//get the distributed object
id <YourDOProtocol> remoteObject = (id <YourDOProtocol>)[NSConnection rootProxyForConnectionWithRegisteredName:@"YourRegisteredName" host:yourHost];

//call a method on the distributed object
@try
{
    NSString* response = [remoteObject responseMethod];
    //do something with response
}
@catch(NSException* e)
{
    //the receiver is invalid, which occurs if the connection cannot be made
    //handle error here
}

答案 1 :(得分:0)

如果您的服务器正在优雅地退出,那么我理解,它会发布NSConnectionDidDieNotification,因为它的连接已关闭,因此您可以像这样注册您的客户端:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];

也许您的connectionDidDie:方法可以设置一个布尔值var,您可以在尝试发送消息之前检查它。

你的DO可以发布通知说它已经开始了(尽管我认为还有系统信息,但我刚刚开始学习DO),你可以同样注册以获得它的启动通知。

我猜Rob的回答是肯定的“全能”,你不必担心通知中心没有及时通过服务器。

我一直在我的第一个应用程序中使用'did die'通知它,我希望它可以帮助你。

托德。