Отображение оповещения о состоянии доступности

Я использую доступность ashleymills: https://github.com/ashleymills/Reachability.swift/releases

В Xcode 7 я написал функцию для отображения предупреждения о статусе доступности.

Однако оповещение никогда не появляется.

Вот мой код:

let reachability = Reachability.reachabilityForInternetConnection()
reachability!.whenReachable = { reachability in
    if reachability.isReachableViaWiFi() {
        let alertController = UIAlertController(title: "Alert", message: "Reachable via WiFi", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

        alertController.addAction(defaultAction)

        self.presentViewController(alertController, animated: true, completion: nil)
    }
    else {
        let alertController = UIAlertController(title: "Alert", message: "Reachable via Cellular", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

        alertController.addAction(defaultAction)

        self.presentViewController(alertController, animated: true, completion: nil)
    }
}

reachability!.whenUnreachable = { reachability in
    let alertController = UIAlertController(title: "Alert", message: "Please connect to internet", preferredStyle: .Alert)
    let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

    alertController.addAction(defaultAction)

    self.presentViewController(alertController, animated: true, completion: nil)
}

reachability!.startNotifier()

person GPH    schedule 04.10.2015    source источник
comment
Я думаю, проблема может заключаться в том, что закрытие не вызывается в основном потоке, поэтому обертывание вашего кода UIAlertController в dispatch_async(dispatch_get_main_queue()) { … } должно решить эту проблему.   -  person Ashley Mills    schedule 05.10.2015


Ответы (1)


Пожалуйста, замените свой код на этот, и он должен работать, может быть ошибка в Reachability после swift 1.2, поэтому здесь я просто проверяю, достижим ли он или нет, и я думаю, что этого достаточно.

На мой взгляд, вам не нужно проверять, является ли это Wi-Fi или сотовой связью. Причина предупреждения не отображается, потому что он не входит в блоки для отображения предупреждения:

let useClosures = false

class ViewController: UIViewController {

    let reachability = Reachability.reachabilityForInternetConnection()

    override func viewDidLoad() {
        super.viewDidLoad()

        if (useClosures) {
            reachability?.whenReachable = { reachability in
                print("Reachable")
            }
            reachability?.whenUnreachable = { reachability in
                print("Unreachable")
            }
        } else {
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: ReachabilityChangedNotification, object: reachability)
        }

        reachability?.startNotifier()

        // Initial reachability check when the app starts
        if let reachability = reachability {
              dispatch_async(dispatch_get_main_queue()) {
            if reachability.isReachable() {
                let alertController = UIAlertController(title: "Alert", message: "Reachable", preferredStyle: .Alert)
                let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

                alertController.addAction(defaultAction)

                self.presentViewController(alertController, animated: true, completion: nil)
            } else {
                let alertController = UIAlertController(title: "Alert", message: "Please connect to internet", preferredStyle: .Alert)
                let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

                alertController.addAction(defaultAction)

                self.presentViewController(alertController, animated: true, completion: nil)
            }
            }
        }
    }

    deinit {

        reachability?.stopNotifier()

        if (!useClosures) {
            NSNotificationCenter.defaultCenter().removeObserver(self, name: ReachabilityChangedNotification, object: nil)
        }
    }


    func reachabilityChanged(note: NSNotification) {
        let reachability = note.object as! Reachability
        // Initial reachability check while surfing in the app
        if reachability.isReachable() {
            let alertController = UIAlertController(title: "Alert", message: "Reachable", preferredStyle: .Alert)
            let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

            alertController.addAction(defaultAction)

            self.presentViewController(alertController, animated: true, completion: nil)

        } else {
            let alertController = UIAlertController(title: "Alert", message: "Please connect to internet", preferredStyle: .Alert)
            let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)

            alertController.addAction(defaultAction)

            self.presentViewController(alertController, animated: true, completion: nil)
        }
    }
}

Примечание. Вы сказали, что в вашем приложении есть webView, помните, что вам нужно обновить или обновить его, когда он будет доступен.

person AaoIi    schedule 04.10.2015
comment
Благодарю вас! Просто протестируйте свой код, но оповещение так и не появится. - person GPH; 04.10.2015
comment
@GPH, куда вы помещаете этот код? в 1_ ? Кстати, в моем случае это показано! - person AaoIi; 04.10.2015
comment
Да, в функции viewDidLoad ViewController.swift - person GPH; 04.10.2015
comment
он появляется только при запуске приложения, если подключение к Интернету меняется после запуска приложения, предупреждение не отображается. Кстати, веб-просмотр ничего не может отобразить после добавления кода. - person GPH; 04.10.2015
comment
Я исправляю некоторые из своих проблем и добавляю ваш код. он показывает ошибку, как показано ниже - person GPH; 05.10.2015
comment
/Volumes/web/MAC/папка без названия/hksalonhk/hksalonhk/SecondViewController.swift:23:13: Инициализация неизменяемого значения «useClosures» никогда не использовалась; рассмотрите возможность замены на присвоение '_' или его удаление /MAC/безымянная папка/hksalonhk/hksalonhk/SecondViewController.swift:71:22: объявление класса не может быть закрыто по значению «useClosures», определенному во внешней области. - person GPH; 05.10.2015
comment
Теперь все в порядке, большое спасибо! Я допустил ошибку раньше. - person GPH; 05.10.2015