0

我对使用 ObjC 的 bonjour/网络非常陌生(尽管精通其他领域!)我正在寻求一些建议 - 我有一个 iOS 应用程序,可以在商店的多个 iPad 上运行。这些应用程序有时必须共享一些数据,而且互联网并不总是可用的,所以网络服务不是一个选项,因此我决定使用 bonjour。

我已经设置了 Bonjour/NSNetservices 并且一切正常,ipad 基本上形成了一个“ad-hoc 网络”并在应用程序启动时自动连接,但是我正在寻找以下情况的建议:

该应用程序通常在后台共享数据,无需任何用户干预 - 但是有一个功能,当在一个应用程序上按下按钮时,应从另一个应用程序远程返回数据。当从其他设备接收到数据时,UI 会更新 - 但是,如果与其他设备的连接断开,则数据将永远不会到达用户设备,并且不会显示数据。我想实现某种形式的 timout,但不确定如何做到这一点 - 任何建议都将不胜感激!

处理流程是这样的:

按钮按下“开发 1”>“开发 1”广播“开发 2 请发送数据消息”>“开发 2”响应请求的数据[此处需要超时]>如果收到数据,则 UI 更新/[如果超时触发,则错误消息显示]

所以我真的只需要在最后一部分暂停 - 我真的想不出一种方法来实现它。

如果需要,我可以为此发布代码。

谢谢!

4

2 回答 2

0

由于您尚未说明您当前如何从其他设备请求数据,因此我不得不做出一些假设。

您可以使用NSURLRequest超时使用requestWithURL:cachePolicy:timeoutInterval:

查看NSURLRequest 文档

于 2013-04-26T14:25:36.737 回答
0

如果您可以手动取消请求,此解决方案可能会起作用。

相信您可以在等待后使用简单NSTimer的取消请求。我确信这不是最好的解决方案,但它可能会起作用。

这就是我将如何做到的。

在您的类中创建您的计时器和一个NSInteger(用于存储计时器值):

NSTimer *timer;
NSInteger timerValue;

timer = [self startTimer];触发请求时调用此方法:

- (NSTimer*)startTimer {

    timerValue = 30;

    return [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTicked:) userInfo:nil repeats:YES];
}

实现timerTicked:方法:

- (void)timerTicked:(NSTimer*)timer {

    timerValue --;

    if (timerValue <= 0) {
        // Cancel the request
        // Show an alert
    }
}

您可以取消计时器,[timer invalidate];但请记住这将“破坏”您的计时器,因此它不会再次触发事件。

于 2013-04-26T11:47:27.540 回答