通常,在我的iOS应用程序中使用大量HTTP请求与服务器通信,我将NSBlockOperation添加到应用程序的全局NSOperationQueue,然后在应用程序检测到Internet连接状态发生更改时挂起并启用队列从而保存当前在队列中的任何请求,直到队列被取消暂停。但是,我不能完全确定以这种方式,当前正在运行的任何操作都将被停止,然后重新添加到队列的顶部。
我的问题是:当您使用HTTP请求到远程服务器时,有没有更好的方法来处理网络状态的变化,即暂停,恢复,取消请求等...
答案 0 :(得分:2)
您可以使用Reachability类来检测网络状态何时发生变化,以避免发送请求。这是基于某些sample code provided by Apple并基于其更新的。这将告知您互联网连接何时更改而不进行轮询。
据我所知,这是检测网络可用性的最佳方法。当网络再次可用时,您将立即收到通知。我相信它甚至可以告诉你哪种连接可用(WiFi或Cellular)。
如果在发出请求时连接断开,您将必须像现在一样处理该条件。
答案 1 :(得分:0)
只是我的想法 - 您应该为您的操作添加取消(手动)like here。当您检测到网络状态更改(无连接)时,您可以取消当前操作,暂停队列,通知某个管理器,以便它可以重新安排操作。当网络可用时,恢复队列。
答案 2 :(得分:0)
交易仅用于此目的。你需要让你的ws调用 atomic ,也就是说,你启动一个事务,进行调用,获得响应并提交事务。然后,您可以确保您的任务已完成。
在其他情况下,你再次启动一个事务,使你的ws调用,ws调用失败,你无法得到响应,无论出于何种原因,你回滚你的事务并记录/报告这种情况。你只需要确定你是否真的无法承受错过的Ws电话。
答案 3 :(得分:0)
正如卢克所说,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.
}