Как использовать 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;
}
}
}];
В настоящее время я использую прослушиватель, чтобы узнать изменения статуса с помощью сети
let net = NetworkReachabilityManager()
net?.startListening()
Может кто-нибудь описать, как поддерживать эти варианты использования?
Ответы
Ответ 1
Я нашел ответ сам, то есть, просто написав слушателю с закрытием, как упомянуто ниже:
let net = NetworkReachabilityManager()
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")
}
}
net?.startListening()
Ответ 2
Класс 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
}
}
Ответ 3
Вот моя реализация. Я использую его в одноэлементном режиме. Не забудьте сохранить ссылку менеджера доступности.
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()
}
Ответ 4
Использование синглтона работает, пока я сохраняю ссылку на 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()
}
Вы будете уведомлены о любых изменениях в состоянии вашей сети. Просто для глазурь на торте это очень хорошая анимация, чтобы показать на ваши потери подключения к Интернету.
Ответ 5
Apple советует использовать структуру вместо класса, когда это возможно. Так что здесь моя версия @rmooney и @Ammad отвечает, но с использованием структуры вместо класса. Кроме того, вместо использования метода или функции, я использую вычисляемое свойство, и я получил эту идею из этого поста Medium @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
}
Ответ 6
SWIFT 5
Структура NetworkState
import Foundation
import Alamofire
struct NetworkState {
var isInternetAvailable:Bool
{
return NetworkReachabilityManager()!.isReachable
}
}
Использование: -
if (NetworkState().isInternetAvailable) {
// Your code here
}