Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 检测/修复非连接故障_Objective C_Cocoa_Nsconnection - Fatal编程技术网

Objective c 检测/修复非连接故障

Objective c 检测/修复非连接故障,objective-c,cocoa,nsconnection,Objective C,Cocoa,Nsconnection,我想使用NSConnection/NSDistributedObject进行进程间通信。我希望客户端能够处理服务器偶尔可以访问的情况 如何确定向NSConnection发送消息是否将失败或已失败?当前,如果我的服务器(出售远程对象的进程)死亡,则如果客户端向远程对象发送选择器,客户端将崩溃 理想情况下,我希望远程对象有一个包装器,可以延迟实例化(或重新实例化)连接,并在连接无法实例化或连接失败的情况下返回默认值。我真的不知道用objective c做这件事的正确方法 下面是一些表示此逻辑的伪代码

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

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

理想情况下,我希望远程对象有一个包装器,可以延迟实例化(或重新实例化)连接,并在连接无法实例化或连接失败的情况下返回默认值。我真的不知道用objective c做这件事的正确方法

下面是一些表示此逻辑的伪代码:

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

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

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

//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
}
//获取分布式对象
id remoteObject=(id)[NSConnection rootProxyForConnectionWithRegisteredName:@“YourRegisteredName”主机:yourHost];
//在分布式对象上调用方法
@试一试
{
NSString*response=[remoteObject responseMethod];
//做些有反应的事情
}
@捕获(N例外*e)
{
//接收器无效,如果无法建立连接,则会发生此情况
//在这里处理错误
}

如果您的服务器正常退出,我的理解是,它会在连接关闭时发布一个
NSConnectionDidDieNotification
,这样您就可以像这样注册您的客户端:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];
也许您的
connectionIDIE:
方法可以设置一个布尔变量,您可以在尝试发送消息之前检查该变量

您的DO可以发布一个通知,说它已经启动(虽然我认为也有系统消息,但我只是刚刚开始了解DO),您也可以注册以获得关于它启动的通知

我猜Rob的答案是明确的“一网打尽”,你不必担心通知中心没有及时接通服务器

我一直在我的第一个DO应用程序中使用“did die”通知,希望它能帮助你

托德