为什么网络状态无法快速更新?

Ali*_*i_C 0 ios swift network-framework

我正在使用iOS 12中引入的新“网络”库,但无法弄清楚为什么用户连接后网络状态没有更新为.satisfied。

这是到目前为止的代码:

import Network

class MapViewController: UIViewController {

    let networkMonitor = NWPathMonitor()
    let queue = DispatchQueue(label: "NetworkMonitor")

    override func viewDidLoad() {
        super.viewDidLoad()

        // check for internet connection
        networkMonitor.pathUpdateHandler = { path in
            if path.status != .satisfied {

                // alert the user to check internet connection
                let alert = UIAlertController(title: "Internet Error", message: "Unable to connect. Please check your internet connection.", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
                alert.addAction(UIAlertAction(title: "Retry", style: .default, handler: { (action) in
                    // TODO: after retry should update status but its not updated
                    print("Status after retry: \(path.status)")
                }))
                self.present(alert, animated: true, completion: nil)
            } else {
                print(path.status)
            }
        }


        networkMonitor.start(queue: queue)
     }
}
Run Code Online (Sandbox Code Playgroud)

为了在模拟器中复制丢失的连接情况,我在视图加载之前关闭了wifi连接,当警报显示时,请点击重试。令人惊讶的是,重试后的状态仍然不令人满意。为什么状态不更新?

目标是点击“重试”,如果用户仍未连接,则在用户连接时继续显示警报,并应点击重试警报。

为了轻松进行网络监视器设置,您可以查看本教程:https : //medium.com/@rwbutler/nwpathmonitor-the-new-reachability-de101a5a8835

请注意,我在实例化NWPathMonitor()时未指定网络类型,因此它会检测所有类型的连接。

Pau*_*w11 5

NWPath是一个结构,因此它是不可变的。在的给定调用中,它不会改变pathUpdateHandler

一旦网络路径可用,您将获得pathUpdateHandler带有.satisfied状态的后续调用。

从用户体验的角度来看,显示模式警报可能不是一个好方法。通常,您可以使用其他指示符(祝酒词或图标)指示网络连接不可用,该指示符会在网络可用后消失或更改。

可替代地或附加地.waitsForConnectivity在您的连接上使用。

  • 抱歉,“.available”是我的拼写错误。`.waitsForConnectivity` 是您在网络连接上设置的属性;请参阅 https://developer.apple.com/videos/play/wwdc2018/715/ 您遇到的用户体验问题是“重试”并不能真正解决问题。您可以做的是使用路径监视来更新指示是否存在网络连接的属性。然后,当用户尝试网络操作时,您会检查该属性,如果不是“.satisfied”,则会显示警报。然后您可以检查此属性,如果用户已连接,则该属性可能已更新 (2认同)
  • 重试应该与您尝试的任何网络操作有关,而与网络本身的状态无关。当您尝试网络操作时,请检查您的财产并在必要时显示警报。这样,当您重试网络操作时,将再次检查该属性,并在必要时再次显示警报。如果未尝试进行任何网络操作,则网络状态的更改不应显示警报,而应仅更新属性。。 (2认同)