6

通常,在使用大量 HTTP 请求与服务器通信的 iOS 应用程序中,我将 NSBlockOperation 添加到应用程序的全局 NSOperationQueue,然后在应用程序检测到 Internet 连接状态发生变化时暂停并启用队列,从而节省任何当前在队列中的请求,直到队列解除挂起。但是,我不完全确定这样,当前正在运行的任何操作都会停止,然后重新添加到队列的顶部。

我的问题是:当您使用对远程服务器的 HTTP 请求(即暂停、恢复、取消请求等)时,是否有更好的方法来处理网络状态的变化......

4

4 回答 4

2

您可以使用Reachability类来检测网络状态何时发生变化,以避免发送请求。这是基于Apple 提供的一些示例代码并从其更新而来的。这将让您知道 Internet 连接何时更改而无需轮询。

据我所知,这是检测网络可用性的最佳方法。当网络再次可用时,您会收到即时通知。我相信它甚至会告诉您可用的连接类型(WiFi 或蜂窝网络)。

如果在发出请求时连接断开,您将不得不像现在一样处理这种情况。

于 2013-02-20T03:39:46.827 回答
0

只是我的想法-您应该像这里一样(手动)添加取消操作。当您检测到网络状态变化(无连接)时,您可以取消当前操作、暂停队列、通知某些管理器以便它可以重新安排操作。当网络可用时,恢复队列。

于 2013-02-18T12:12:49.420 回答
0

交易就是为了这个目的。您需要使您的 ws 调用原子化,也就是说,您启动一​​个事务、进行调用、获取响应并提交事务。然后你就可以确定你的任务已经完成了。

在其他情况下,您再次启动事务,进行 ws 调用,ws 调用失败并且您无法获得响应,无论出于何种原因,您回滚事务并记录/报告这种情况。你只需要确定你是否真的不能承受错过的 ws 调用。

于 2013-02-19T13:29:38.003 回答
0

正如 Luke 所建议的,Apple sample最好处理这个问题。但我也想解决您对网络连接中更改检测的需求。这是通过观察名为 kReachabilityChangedNotification 的通知来处理的。

换句话说,您的视图控制器或委托代码必须具有以下部分才能处理网络可达性(阅读“连接性”)更改:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

//Called by Reachability whenever status changes.    
- (void) reachabilityChanged: (NSNotification* )note    
{    
      Reachability* curReach = [note object];        
      //TODO: Your specific handling.
}
于 2013-02-21T17:04:50.557 回答