2017-03-14 11 views
1

私はAlamoreFireを使用しており、両方のviewDidAppearメソッドの2つのアプリケーションのView Controllerでネットワークの到達可能性をチェックしています。しかし、ネットワークが見つかると、ビューコントローラのコレクションビューが2回読み込まれることがあります。 私はReachabilityがアプリケーション全体で1つの場所に置かれるべきではないかと推測しています。viewDidAppearまたはAppDelegateの到達可能性を確認しますか?

確認する複数のView Controllerを持っている場合に、Reachabilityを実装するための最良かつクリーンな方法は何ですか? AlamoFireのNetworkReachabilityManagerを使用したいと思います。

+0

closure resultHandlerにダブルアップを持たないのはどこですか? – Sethmr

+0

@ dkw5877私はクラスについて知っています、私の質問は、コードでは、AppDelegateを実装する、または各ViewDidAppearメソッドでより適切なはずです。 – Giovanni

+0

私は@ Velix007アプローチを私がオフラインモードを持たないアプリで使ってきました。アプリケーションデリゲートのステータス変更を監視し、最上位のビューコントローラからインターネット接続ビューコントローラを表示します。 –

答えて

0

以下の方法があります。あなたの質問にもっと直接的になるために、私はどちらかで接続をチェックしません。

例:私はアプリの最初のネットワーク通話にアクセスしてから、Wi-Fiをオンにします。

問題:アプリケーションでWi-Fiが必要なものは使用されていませんが、私のアプリケーションは失敗します。

私の方法:ログインページのネットワーク接続を確認できますが、それ以外にもネットワークに接続します。ネットワークコールが失敗した場合は、接続を確認してから、サーバーのためにコールが失敗したかどうか、またはネットワークのためにコールが失敗したかどうかをユーザーに関連付けます。

これは私が到達可能性のために使用するものです。

import Foundation 

/// This class is designed to check if the network is connected. 
open class Reachability { 

    /// This function will hit two urls that should never be totally down to see if the device is connected 
    /// If either url connects, this returns true 
    /// 
    /// - Parameter resultHandler: returns the result of the connection existing as a Bool in a resultHandler 
    class func isConnectedToNetwork(_ resultHandler: @escaping (_ isTrue: Bool) -> Void) { 
     let urlA = URL(string: "https://google.com/") 
     let urlB = URL(string: "https://baidu.com/") 

     Reachability.fetchURL(urlA!) { isTrue in 
      if isTrue { 
       print("NETWORK STATUS: \(isTrue)") 
       resultHandler(isTrue) 
      } else { 
       Reachability.fetchURL(urlB!, resultHandler: resultHandler) 
      } 
     } 
    } 

    /// Hits a URL in order to see if the device can connect to it 
    /// 
    /// - Parameters: 
    /// - url: the url to request 
    /// - resultHandler: returns whether the url was successfully retrieved or not 
    class func fetchURL(_ url:URL, resultHandler: @escaping (_ isTrue: Bool) -> Void) { 
     var request = URLRequest(url: url) 
     request.httpMethod = "HEAD" 
     request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData 
     request.timeoutInterval = 10.0 

     let session = URLSession(configuration: .default) 
     let dataTask = session.dataTask(with: request) { data, response, error in 
      if let httpResponse = response as? HTTPURLResponse { 
       if httpResponse.statusCode == 200 { 
        resultHandler(true) 
       } else { 
        resultHandler(false) 
       } 
      } else { 
       resultHandler(false) 
      } 
     } 
     dataTask.resume() 
    } 
} 

は次にどこかのコードで、あなたはそうのようにそれを呼び出すことができます。

Reachability.isConnectedToNetwork() { isConnected in 
    if isConnected { 
     //Do something when connected 
    } else { 
     //Do something when not connected 
    } 
} 
+1

これは、OPが尋ねたものではありません。どのようにネットワーク状態の変化を監視するのですか?通知が変更された場合、どのように通知しますか? –

+0

私は自分のチェックをネットワークコールで行うので、失敗したときになぜ失敗したのかをユーザに常に伝えることができます。それに応じて行動を取る必要がある場合は、その時点で行動します。 – Sethmr

+0

テーブルビューをお持ちの場合は、読み込むときにすべてのセルをチェックしますか? –

1

通常到達可能性をあなたは上のエラービューのいくつかの並べ替えを持っていると思います背景が読み込もうとしているかどうかは心配しないでください。

はコンテナビューを作成し、のviewDidLoadで()あなたの問題を解決し、UXに役立ちます

if Reachability.isConnectedToNetwork() == true { 
     self.errorView.isHidden = true 
    } else { 
     self.errorView.isHidden = false 
    } 

+0

ありがとうございましたVelix007、私はAlamofire.request(url).validate()を使用しており、既にそこにチェックインしているので、実際に私のアプリはクラッシュしません。あなたが言うように私はerrorViewと回転する私の活動インジケータを重ねることができます。私はちょうどそれがそれを行うための "正しい"方法であるかどうか確信がありませんでした。 – Giovanni

+0

私は確信していますが、UXの観点と私の経験からすれば、スクリーンが2倍の負荷であるため、ユーザーがアプリケーションが乱れていると思うよりも優れています、3倍。 errorView ftw。 – Velix007

関連する問題