Как использовать NetworkReachabilityManager в Alamofire

Я хочу функциональность, похожую на AFNetworking в Objective-C с Alamofire NetworkReachabilityManager в 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;
        }
    }
}];

В настоящее время я использую прослушиватель, чтобы узнать изменения статуса с помощью network

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

может кто-нибудь описать, как поддерживать эти варианты использования?

5 ответов


Класс NetworkManager

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()
   }
}

Запустить Обозреватель Достижимости Сети

@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
    }
}

вот моя реализация. Я использую его в синглтоне. Не забудьте сохранить ссылку на Reachability manager.

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()
}

использование синглтона работает до тех пор, пока вы сохраняете ссылку на reachabilityManager

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()
}

таким образом, вы можете использовать его в любом месте вашего приложения:

let networkStatus = NetworkStatus.sharedInstance

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

вы будете уведомлены о любом изменении состояния вашей сети. Только для глазури на торте этой очень хорошая анимация, чтобы показать на вашей потере подключения к интернету.


Apple говорит использовать структуру вместо класса, когда вы можете. Итак, вот моя версия ответов @rmooney и @Ammad, но с использованием структуры вместо класса. Кроме того, вместо использования метода или функции я использую вычисляемое свойство, и я получил эту идею от этого носителя в должности @Abhimuralidharan. Я просто ставлю как идею использования структуры вместо класса (поэтому вам не нужно иметь синглтон), так и использование вычисляемого свойства вместо вызова метода вместе в одном решении.

вот структура 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
    }
}

вот как вы используете его в ваш код:

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