Сделайте запрос Alamofire после восстановления сетевого подключения - PullRequest
0 голосов
/ 20 октября 2018

Я создаю приложение, которое должно отправлять 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-запросы, которые мне нужно выполнить.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Скриншоты:

enter image description here

Интернет-соединение в порядке

Повторное открытие приложения.Подключение к Интернету: НЕПРАВИЛЬНО (Режим полета)

enter image description here enter image description here

Подключение к Интернету снова в порядке, но не извлекается

enter image description here

Здесьчто я модифицировал:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = "Explore".localized

    // Configure reachability observer on this controller
    Reachability.shared.currentViewController(self)

    if Location.shared.requestAuth(){
        if (Reachability.shared.reachabilityManager?.isReachable)!{
            if self.networkFlag{
                self.fetchPosts()
                self.setUpCameraPosition()
            }
        }else{
            self.networkFlag = false
        }
    }

}
0 голосов
/ 20 октября 2018

Вы можете установить флаг при первом запуске сетевого соединения https api.

var networkFlag = true

В этом случае ваша программа будет знать, что вы действительно запустили сетевой вызов.Затем, когда вы находитесь между запросом, и подключение к Интернету недоступно, это выдает всплывающее окно.

Решение для повторного вызова HTTPS: В коде, где вы проверяете, является ли доступность сети истинным, введите ifи проверьте установленный ранее флаг, если установлено сетевое соединение.

//check for network reachability
if(reachable)
{
//check the flag set earlier which indicates network call was made
if(networkFlag)
{
//make an https call--your network call
//https:call put your method call here
}

Надеюсь, это поможет:)

...