webentwicklung-frage-antwort-db.com.de

So verwenden Sie NetworkReachabilityManager in Alamofire

Ich möchte eine ähnliche Funktionalität wie AFNetworking in Objective-C mit Alamofire NetworkReachabilityManager in Swift:

//Reachability detection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN: {
            [self LoadNoInternetView:NO];
            break;
        }
        case AFNetworkReachabilityStatusReachableViaWiFi: {
            [self LoadNoInternetView:NO];
            break;
        }
        case AFNetworkReachabilityStatusNotReachable: {
            break;
        }
        default: {
            break;
        }
    }
}];

Ich verwende derzeit den Listener, um die Statusänderungen des Netzwerks zu erfahren

let net = NetworkReachabilityManager()
net?.startListening()

Kann jemand beschreiben, wie diese Anwendungsfälle unterstützt werden sollen?

16
MuraliMohan

Ich habe die Antwort selbst gefunden, d. H. Indem ich einfach einen Hörer mit dem folgenden Verschluss schrieb: 

let net = NetworkReachabilityManager()
net?.startListening()

net?.listener = { status in
    if net?.isReachable ?? false {

    switch status {

    case .reachable(.ethernetOrWiFi):
        print("The network is reachable over the WiFi connection")

    case .reachable(.wwan):
        print("The network is reachable over the WWAN connection")

    case .notReachable:
        print("The network is not reachable")

    case .unknown :
        print("It is unknown whether the network is reachable")

    }
}
16
MuraliMohan

NetworkManager-Klasse

class NetworkManager {

//shared instance
static let shared = NetworkManager()

let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.google.com")

func startNetworkReachabilityObserver() {

    reachabilityManager?.listener = { status in
        switch status {

            case .notReachable:
                print("The network is not reachable")

            case .unknown :
                print("It is unknown whether the network is reachable")

            case .reachable(.ethernetOrWiFi):
                print("The network is reachable over the WiFi connection")

            case .reachable(.wwan):
                print("The network is reachable over the WWAN connection")

            }
        }

        // start listening
        reachabilityManager?.startListening()
   }
}

Network Reachability Observer starten

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        // add network reachability observer on app start
        NetworkManager.shared.startNetworkReachabilityObserver()

        return true
    }
}
28
Kirit Vaghela

Hier ist meine Implementierung. Ich benutze es in einem Singleton. Denken Sie daran, die Erreichbarkeitsmanager-Referenz beizubehalten.

let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.Apple.com")

func listenForReachability() {
    self.reachabilityManager?.listener = { status in
        print("Network Status Changed: \(status)")
        switch status {
        case .NotReachable:
            //Show error state
        case .Reachable(_), .Unknown:
            //Hide error state
        }
    }

    self.reachabilityManager?.startListening()
}
15
rmooney

Die Verwendung eines Singleton funktioniert, solange Sie einen Verweis auf reachabilityManager aufbewahren

class NetworkStatus {
static let sharedInstance = NetworkStatus()

private init() {}

let reachabilityManager = Alamofire.NetworkReachabilityManager(Host: "www.Apple.com")

func startNetworkReachabilityObserver() {
    reachabilityManager?.listener = { status in

        switch status {

        case .notReachable:
            print("The network is not reachable")

        case .unknown :
            print("It is unknown whether the network is reachable")

        case .reachable(.ethernetOrWiFi):
            print("The network is reachable over the WiFi connection")

        case .reachable(.wwan):
            print("The network is reachable over the WWAN connection")

        }
    }
    reachabilityManager?.startListening()
}

So können Sie es überall in Ihrer App verwenden:

let networkStatus = NetworkStatus.sharedInstance

override func awakeFromNib() {
    super.awakeFromNib()
    networkStatus.startNetworkReachabilityObserver()
}

Sie werden über jede Änderung Ihres Netzwerkstatus informiert. Nur für das Sahnehäubchen dies ist eine sehr gute Animation, die auf Ihrem Internet-Verbindungsverlust angezeigt wird.

6
Ammad

Swift 5

NetworkState Structure

import Foundation
import Alamofire

struct NetworkState {

    var isInternetAvailable:Bool
    {
        return NetworkReachabilityManager()!.isReachable
    }
}

Verwenden Sie: -

  if (NetworkState().isInternetAvailable) {
        // Your code here
   }
1
Lakhdeep Singh

Apple sagt, dass Sie, wenn möglich, eine Struktur anstelle einer Klasse verwenden. Also hier meine Version von @rmooney und @Ammad's Antworten, allerdings mit einer struct anstelle einer Klasse. Anstatt eine Methode oder Funktion zu verwenden, verwende ich außerdem eine berechnete Eigenschaft, und ich habe diese Idee von diesem Medium post von @Abhimuralidharan erhalten. Ich habe nur die Idee, eine struct anstelle einer Klasse zu verwenden (damit Sie keinen Singleton haben müssen) und eine berechnete Eigenschaft anstelle eines Methodenaufrufs in einer Lösung zu verwenden.

Hier ist der struct NetworkState:

import Foundation
import Alamofire

struct NetworkState {

    var isConnected: Bool {
        // isReachable checks for wwan, ethernet, and wifi, if
        // you only want 1 or 2 of these, the change the .isReachable
        // at the end to one of the other options.
        return NetworkReachabilityManager(Host: www.Apple.com)!.isReachable
    }
}

So verwenden Sie es in Ihrem Code:

if NetworkState().isConnected {
    // do your is Connected stuff here
}
0
jonathan3087