Я создаю приложение, которое должно отправлять HTTP-запросы к API.Я хочу обработать состояние сетевого подключения, поэтому, когда сеть недоступна, появляется всплывающее диалоговое окно, а когда сеть снова становится доступной, всплывающее окно закрывается.
В настоящее время я могу это сделать, ПРОБЛЕМА заключается в том, чтокогда всплывающее окно закрыто, потому что сеть снова достижима, я не знаю, как (или где) снова делать HTTP-запросы.
Я создал класс синглтона для обработки достижимости:
import Foundation
import PopupDialog
import Alamofire
class Reachability {
private var currentViewController : UIViewController? = nil
private var popup : PopupDialog? = nil
let title = "Network connection error".localized
let message = "It seems you have problems with connection, please check your internet connection.".localized
let settingsButton = DefaultButton(title: "Settings".localized, action: {
if let url = URL(string:"App-Prefs:root=Settings&path=General") {
UIApplication.shared.open(url)
}
})
//shared instance
static let shared = Reachability()
let reachabilityManager = Alamofire.NetworkReachabilityManager(host: "www.google.com")
}
extension Reachability{
/**
Starts network observer and manages to listen on different kind of network
changes. Popup warning dialogs will be presented based on different kind of network status
such as network is not reachable and once network resorts back online defined popup dialog will
be dismissed automatically.
**/
public func startNetworkReachabilityObserver() {
if let status = reachabilityManager?.isReachable, status == false {
if self.currentViewController != nil{
}
self.presentReachabilityPopup()
return
}
reachabilityManager?.listener = { status in
switch status {
case .notReachable:
if self.currentViewController != nil {
self.presentReachabilityPopup()
}
break
case .unknown :
break
case .reachable(.ethernetOrWiFi), .reachable(.wwan):
if self.popup != nil ,self.currentViewController != nil {
self.popup?.dismiss()
}
break
}
}
reachabilityManager?.startListening()
}
public func stopNetworkReachabilityObserver() {
reachabilityManager?.stopListening()
}
// Configure current view controller as a network observer
public func currentViewController(_ vc: UIViewController?) {
self.currentViewController = vc
self.startNetworkReachabilityObserver() // Start network observer
}
// Presents an alert dialog box notifying the users concerning the network issues
private func presentReachabilityPopup() {
self.popup = PopupDialog(title: title, message: message )
self.popup?.addButton(settingsButton)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.5) {
if self.currentViewController != nil{
self.currentViewController?.present(self.popup!, animated: true, completion: nil)
}
}
}
}
А вот пример ViewController, который должен сделать HTTP-запрос, когда сеть снова станет доступной:
import UIKit
import GoogleMaps
class ExploreViewController: UIViewController, GMSMapViewDelegate{
//MARK: Properties
var posts:[Post] = []
var followers:[User] = []
var images = [UIImage]()
@IBOutlet weak var mapView: GMSMapView!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Explore".localized
// Configure reachability observer on this controller
Reachability.shared.currentViewController(self)
if Location.shared.requestAuth(){
self.fetchPosts()
self.setUpCameraPosition()
}
}
Функция fetchPosts () содержит HTTP-запросы, которые мне нужно выполнить.