【问题标题】:Why does NWPathMonitor status is always satisfied?为什么 NWPathMonitor 状态总是满足?
【发布时间】:2019-08-15 21:04:44
【问题描述】:

当没有连接时,我从 URL 会话中收到一条错误消息,指出请求超时。
我正在使用网络协议事先检查连接,但显然这不起作用,因为当我在 viewDidLoad 内部调用它时:

static func startUpdateProcess() {
    let monitor = NWPathMonitor()

    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            print("Good! We are connected!")
            Helper.createDownloadTask()
        } else {
            print("No connection. Local file not updated!")
        }
    }
    let queue = DispatchQueue(label: "Monitor")
    monitor.start(queue: queue)
}

...我得到“好!我们有联系!”。 如果没有连接,不应该不满足路径并因此触发else语句吗?
仅供参考 createDownloadTask() 质疑 API 并下载所需数据。

你能告诉我这里出了什么问题吗?如果路径不满足,我该怎么做才能到达else 语句?

谢谢!

【问题讨论】:

    标签: ios swift network-programming urlsession


    【解决方案1】:

    需要保留对NWPathMonitor(在您的场景中也称为monitor)实例的引用。

    您可以通过将monitor 设为类级别属性,使其生命周期与您引用它的位置相同,从而使其成为一个强大的属性。看起来monitor 对象正在被释放,有效地停止了网络状态监控的回调。

    【讨论】:

    • 最初它是一个类级别的属性,但由于此方法不在 ViewController.swift 文件(和类)中,如果将其留在外面,我会收到错误消息。我想知道是什么让 pathUpdateHandler 认为状态是满意的。我已连接到网络但没有连接(即提供商遇到问题并且没有数据交换)。它仍然算作连接成功吗?我应该检查其他东西吗?
    • NetworkPathMonitor 应该只是告诉您是否已连接到 Internet,据我所知。尝试关闭 wifi 和蜂窝数据,看看是否调用了 No connection
    • 就是这样!我想知道是否还有另一件事可以检查实际交换数据的连接性。还是谢谢你!
    • 顺便说一句,将属性设置为类级别并在前面使用static 也有效,只是将它留在方法定义中对我来说看起来更合乎逻辑,因为此类仅用于提供功能。
    • 我认为你应该回答它。这对偶然发现它的人很有用。
    【解决方案2】:

    感谢用户 May Rest in Peace 为我指明了正确的方向。

    尽管文档对网络协议保持沉默,但只要设备连接到网络,NWPath 类的status 属性(NWPath.Status 类型的枚举)似乎返回.satisfied ,无论该网络是否正在工作、正在传输数据。

    触发上述else 语句的唯一方法是在启动应用程序之前停用 Wi-Fi 和/或蜂窝数据或断开与任何网络的连接。

    所有这些属性都列在文档中,但没有一个附有描述或讨论。 用户@twostraws 的This article 允许我创建该代码的第一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 2011-07-27
      • 1970-01-01
      • 2021-07-17
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多