6

通常、サーバーとの通信に非常に多くのHTTPリクエストを使用するiOSアプリケーションでは、NSBlockOperationをアプリのグローバルNSOperationQueueに追加し、アプリケーションがインターネット接続ステータスの変更を検出したときにキューを一時停止して有効にし、キューの一時停止が解除されるまで、現在キューにあるリクエスト。ただし、この方法で現在実行中の操作が停止され、キューの先頭に再度追加されるかどうかは完全にはわかりません。

私の質問は、リモートサーバーへのHTTPリクエストを処理しているとき、つまりリクエストの一時停止、再開、キャンセルなどで、ネットワークステータスの変化に対処するためのより良い方法はありますか?

4

4 に答える 4

2

Reachabilityクラスを使用して、ネットワークステータスがいつ変更されたかを検出し、要求の送信を回避できます。これは、Appleが提供するいくつかのサンプルコードに基づいており、それらから更新されています。これにより、ポーリングせずにインターネット接続が変更されたときに通知されます。

私の知る限り、これはネットワークの可用性を検出するための最良の方法です。ネットワークが再び利用可能になると、すぐに通知が届きます。どんな種類の接続(WiFiまたはセルラー)が利用できるかさえ教えてくれると思います。

リクエスト中に接続が切断された場合は、現在の状態でその状態を処理する必要があります。

于 2013-02-20T03:39:46.827 に答える
0

トランザクションはこの目的のためだけのものです。ws呼び出しをアトミックにする必要があります。つまり、トランザクションを開始し、呼び出しを行い、応答を取得して、トランザクションをコミットする必要があります。そうすれば、タスクが完了したことを確認できます。

それ以外の場合は、トランザクションを再開してws呼び出しを行い、ws呼び出しが失敗し、何らかの理由で応答を取得できず、トランザクションをロールバックしてこの状況をログに記録/報告します。本当にws呼び出しを逃す余裕がないかどうかを確認する必要があります。

于 2013-02-19T13:29:38.003 に答える
0

私の考えですが、ここのように(手動で)操作にキャンセルを追加する必要があります。ネットワークステータスの変更(接続なし)を検出すると、現在の操作をキャンセルし、キューを一時停止し、一部のマネージャーに通知して、操作のスケジュールを変更できます。ネットワークが利用可能になったら、キューを再開します。

于 2013-02-18T12:12:49.420 に答える
0

Lukeが示唆しているように、これを処理するにはAppleサンプルが最適です。ただし、ネットワーク接続での変更検出の必要性にも対応したいと思います。これは、kReachabilityChangedNotificationという名前の通知を監視することによって処理されます。

つまり、ネットワークの到達可能性(「接続性」と読みます)の変更を処理するには、ViewControllerまたはデリゲートコードに次の要素が必要です。

[[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 に答える