Objective-C:避免分布式对象的NSConnection失败时的异常



我正在使用Objective-C分布式对象(DO)将数据从一个应用程序(从网络收集数据)共享到另一个应用程序(Quartz Composer内部的补丁)。 当与远处对象的连接失败时(当我关闭第一个应用程序时),我得到:

5/16/12 8:17:06.373 PM Quartz Composer: *** EXCEPTION IGNORED: connection went invalid while waiting for a reply because a mach port died

在那之后,石英组合物被挂起。 即使在我恢复第一个应用程序之后,它仍然挂起。 我希望石英补丁重新连接。

我正在使用通知中心关闭旧对象,如下所示:

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

现在,我的表弟DidDie看起来像这样:

- (void) connectionDidDie
{
    NSLog(@"Connection died and we detected it");
    [[self proxyObject] release];
    [self setProxyObject:nil];
    theConnection = nil;
}

在访问 proxyObject 的任何部分之前,我还检查以确保连接仍然处于活动状态,如下所示:

if ([NSConnection defaultConnection]) { // this line triggers the exception
    // access proxyObject
}

我也试过

if ([theConnection isValid]) { // this line triggers the exception
    // access proxyObject
}

在这两种情况下,都是这个测试触发了这个异常。

当我关闭第一个应用程序时,我可以做些什么来防止石英挂起,谁拥有自动售货的对象?

我从来没有找到一种方法来足够快地关闭 DO 连接以防止 QC,QC 每秒绘制 30-60 帧,在连接之前预先测试连接(并崩溃)DidDie: 被调用。 最终,我决定使用 DO,只是为了获得对象的初始副本,然后执行深层复制,然后在没有尝试访问它的情况下终止 DO 连接。 DO似乎不是那么好的解决方案,在你深入研究它之后。:(

最新更新