2017-11-13 7 views
1

私はAlamofire NetworkReachabilityManagerを使用して、以下のような接続を管理しています。ネットワーク接続は変更されたときのみにする必要があります

let reachabilityManager = NetworkReachabilityManager() 
    reachabilityManager?.listener = { [weak self] status in 
      switch status { 
      case .notReachable: 
       self?.connectionType = .notReachable 
       break 
      case .unknown: 
       self?.connectionType = .notReachable 
       break 
      case .reachable(.ethernetOrWiFi): 
       self?.connectionType = .wifi 
       break 
      case .reachable(.wwan): 
       self?.connectionType = .cellular 

       break 
      } 

public enum ReachabilityStatus { 
    case unknown 
    case notReachable 
    case wifi 
    case cellular 
} 

私は、アプリケーション自体を起動していたとき、私はこのコールバックを取得していますが、私は、ネットワーク接続に変更があった場合にのみ、私は必要なこのコールバックは、コールバックしたくありません。

どうすればこの問題を解決できますか?

答えて

2

前の状態を保存する変数を作成し、最初の呼び出しで変数がnilであるかどうかを確認する方法はありますか。その後、状態が変更されたかどうかを常に確認することができます。

let reachabilityManager = NetworkReachabilityManager() 
var previousStatus: ReachabilityStatus? = nil 

reachabilityManager?.listener = { [weak self] status in 

    if let p = self.previousStatus, p == status { 
     return // status hasn't changed 
    } else { 
     // status is nil 
     self.previousStatus = status 
     return 
    } 

    switch status { 
    case .notReachable: 
     self?.connectionType = .notReachable 
     break 
    case .unknown: 
     self?.connectionType = .notReachable 
     break 
    case .reachable(.ethernetOrWiFi): 
     self?.connectionType = .wifi 
     break 
    case .reachable(.wwan): 
     self?.connectionType = .cellular 

     break 
} 
0

少し遅れて追加することができます。したがって、NetworkReachabilityManagerがアプリの起動時にインスタンス化されると、リスナーはゼロになります。

let reachabilityManager = NetworkReachabilityManager() 
    var previousStatus: ReachabilityStatus? = nil 

    DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: { 
    reachabilityManager?.listener = { [weak self] status in 

    if let p = self.previousStatus, p == status { 
     return // status hasn't changed 
    } else { 
     // status is nil 
     self.previousStatus = status 
     return 
    } 

    switch status { 
    case .notReachable: 
     self?.connectionType = .notReachable 
     break 
    case .unknown: 
     self?.connectionType = .notReachable 
     break 
    case .reachable(.ethernetOrWiFi): 
     self?.connectionType = .wifi 
     break 
    case .reachable(.wwan): 
     self?.connectionType = .cellular 

     break 
} 
}) 

編集:私はこのコードをテストしました。できます。

関連する問題