2015-11-23 4 views
5

Ich möchte eine Methode aufrufen, wenn meine iOS App startet, aber ich möchte diese Methode nur aufrufen, wenn eine Verbindung besteht. Ich habe festgestellt, dass Sie in Objective-C Reachable verwenden können, aber es stellt sich heraus, dass diese Methode nicht Teil von Swift ist.Swift: Wie kann ich einen Listener haben, der meldet, wenn die Verbindung verloren geht und wann sie zurückkommt?

Ich habe eine pod gefunden Reachability.swift genannt, und ich bin mit dem Beispiel, das zur Verfügung gestellt wurde:

override func viewWillAppear(animated: Bool) { 
    let reachability: Reachability 
    do { 
     reachability = try Reachability.reachabilityForInternetConnection() 
    } catch { 
     print("Unable to create Reachability") 
     return 
    } 
    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "reachabilityChanged:", 
     name: ReachabilityChangedNotification, 
     object: reachability) 

    do { 
     try reachability.startNotifier() 
    } catch { 
     print("This is not working.") 
      return 
    } 
} 

func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 
     if reachability.isReachableViaWiFi() { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Dies wird jedoch nicht richtig funktioniert. Ich arbeite nur wenn ich den ViewController betrete, aber nicht wenn ich das WLAN einschalte und ausschalte.

Antwort

11

Ich habe dieses Problem zu lösen, indem reachability als Instanzvariable des Viewcontroller erklärt:

var reachability: Reachability! 

Also diese Variablen aus dem Verfahren viewWillAppear entfernt werden sollen.

Swift 2

override func viewWillAppear(animated: Bool) { 
    do { 
     reachability = try Reachability.reachabilityForInternetConnection() 
    } catch { 
     print("Unable to create Reachability") 
     return 
    } 

    NSNotificationCenter.defaultCenter().addObserver(self, 
     selector: "reachabilityChanged:", 
     name: ReachabilityChangedNotification, 
     object: reachability) 

    do { 
     try reachability.startNotifier() 
    } catch { 
     print("This is not working.") 
     return 
    } 

} 

func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 
     if reachability.isReachableViaWiFi() { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Swift 3 (bereitgestellt von Burning)

var reachability: Reachability! 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    reachability = Reachability() 
    NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged(_:)), name: Notification.Name.reachabilityChanged, object: reachability) 

    do { 
     try reachability?.startNotifier() 
    } catch { 
     print("This is not working.") 
     return 
    } 

} 

func reachabilityChanged(_ note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.connection != .none { 
     if reachability.connection == .wifi { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     print("Not reachable") 
    } 
} 

Dieses richtig gearbeitet :).

+1

Hey ich habe versucht, dies für mein Projekt zu verwenden, aber es scheint, dass in schnelle 3 .reachabilityForInternetConnection() wird nicht erkannt: können Sie mir helfen, wie Sie es beheben? – Dakata

+1

Ihre Lösung hat auch für mich funktioniert ... Danke! :) –