我想使用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
答案 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'通知它,我希望它可以帮助你。
托德。