【问题标题】:iOS bonjour programming - wait for a responseiOS bonjour 编程 - 等待响应
【发布时间】:2013-04-26 10:56:38
【问题描述】:

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

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

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

这个过程的流程是这样的:

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

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

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

谢谢!

【问题讨论】:

  • 向我们展示您的设备向其他设备发出请求的代码。

标签: ios objective-c xcode bonjour


【解决方案1】:

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

我相信您可以使用简单的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]; 取消计时器,但请记住,这会“破坏”您的计时器,因此它不会再次触发事件。

【讨论】:

  • 不是我——我的声望不够!我正在考虑这种解决方案 - 我不确定苹果会采取什么样的观点,但我想它不会阻塞主线程或任何东西,所以应该是安全的!
  • @PaulWalton:我不知道你是否已经解决了你的问题,但为了回答你的评论,我看不出苹果有任何理由拒绝使用这个的应用程序..
【解决方案2】:

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

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

见NSURLRequest documentation

【讨论】:

  • 嗨尼克,很抱歉今天离开我的 Mac 并错过了您的第一条评论 - 不幸的是,我已经为 bonjour 网络设置了自己的协议,今晚我将编辑我原来的问题。不过感谢您的回复!
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多