Прежде всего, я собираюсь ответить на это с точки зрения iOS.Но ваша демонстрация GitHub предназначена для macOS.Я думаю, что основы одинаковы.
Я пойду, чтобы решить эту проблему в подходе, ориентированном на протокол.
Обновление:
После довольно большого поиска яВы столкнулись с великолепной реализацией оболочки Connectivity .Существует даже описательный пост в блоге Решение проблемы портала авторизации на iOS , если вы хотите узнать о нем больше. Эта реализация может работать с фактическими доступными / недоступными состояниями Интернета.
Примечание: Не любите читать дальше? Здесь - это рабочая версия, которую я кратко проиллюстрирую.Панель навигации будет отображаться с Зеленый & Красный цвет для различных состояний подключения.
Определите протокол:
Этот протокол поможет любому заинтересованному объектуполучать уведомления при любых изменениях в подключении.
protocol ConnectivityNotifiable {
var connectivity: Connectivity { get }
func startNotifyingConnectivityChangeStatus()
func stopNotifyingConnectivityChangeStatus()
func connectivityChanged(toStatus: ConnectivityStatus)
}
// Provide some default implementation through protocol extension
extension ConnectivityNotifiable {
func startNotifyingConnectivityChangeStatus() {
connectivity.isPollingEnabled = true
connectivity.startNotifier()
connectivity.whenConnected = { connectivity in
self.connectivityChanged(toStatus: connectivity.status)
}
connectivity.whenDisconnected = { connectivity in
self.connectivityChanged(toStatus: connectivity.status)
}
}
func stopNotifyingConnectivityChangeStatus() {
connectivity.stopNotifier()
}
}
Соответствовать протоколу:
Соответствие протоколу ConnectivityNotifiable
добавит функциональность любому заинтересованному объекту, который будет уведомлен при статусе подключенияизменения.Что-то вроде мониторинга.
class ViewController: UIViewController, ConnectivityNotifiable {
// ConnectivityNotifiable protocol requirement
let connectivity = Connectivity()
override func viewDidLoad() {
super.viewDidLoad()
// Invoke the default implementation of the ConnectivityNotifiable protocol
// requirement to be able to be notified
startNotifyingConnectivityChangeStatus()
// Reminder:
// Don't forget to invoke stopNotifyingConnectivityChangeStatus() when
// you are done or when the lifecycle of your controller ends
}
// ConnectivityNotifiable protocol requirement
func connectivityChanged(toStatus: ConnectivityStatus) {
// Everytime any change happens in the network connectivity
// this method will be invoked with appropriate connection status
switch toStatus {
case .connected,
.connectedViaWiFi,
.connectedViaCellular:
// Connected/Internet available. Update any UI component
case .notConnected,
.connectedViaWiFiWithoutInternet,
.connectedViaCellularWithoutInternet:
// Disconnected/Internet not available. Update any UI component
}
}
}
Старый ответ
Примечание: Если вы используете самую последнюю версию из Достижимость , вам не понадобится решение на основе NotificationCenter
для получения уведомления об изменении достижимости.Он полностью работает с подходом, основанным на замыкании.
Не хотите знать, как этого добиться? Здесь - рабочая версия для платформы iOS.Клонируйте репо и проверьте себя.Панель навигации будет отображаться с Зеленый , Оранжевый & Красный Цвет для различных состояний подключения.
Определить протокол:
Этот протокол поможет любому заинтересованному объекту получать уведомления о любых изменениях достижимости.
protocol Reachable {
var reachability: Reachability { get }
func startMonitoringReachabilityChangeStatus()
func reachabilityChanged(to: Reachability.Connection)
}
extension Reachable {
func startMonitoringReachabilityChangeStatus() {
do {
try reachability.startNotifier()
} catch {
print(error.localizedDescription)
}
reachability.whenReachable = { reachability in
self.reachabilityChanged(to: reachability.connection)
}
reachability.whenUnreachable = { reachability in
self.reachabilityChanged(to: reachability.connection)
}
}
}
Соответствует протоколу:
Соответствуетк протоколу Reachable
добавится функциональность к любому заинтересованному объекту, который будет уведомляться при изменении состояния достижимости.Что-то вроде мониторинга.
class ViewController: UIViewController, Reachable {
// Reachable protocol requirement
let reachability: Reachability = Reachability()!
override func viewDidLoad() {
super.viewDidLoad()
// initial reachability checkup
reachabilityChanged(to: reachability.connection)
// Invoke the default implementation of the Reachable protocol requirement
// to be able to be notified
startMonitoringReachabilityChangeStatus()
}
// Reachable protocol requirement
func reachabilityChanged(to: Reachability.Connection) {
// Everytime any change happens in the network connectivity
// this method will be invoked with appropriate connection status
switch to {
case .wifi:
DispatchQueue.main.async {
// Update any UI component
}
case .cellular:
DispatchQueue.main.async {
// Update any UI component
}
case .none:
DispatchQueue.main.async {
// Update any UI component
}
}
}
}