为啥当路径满足时 NWPathMonitor 不给出路径更新?

Posted

技术标签:

【中文标题】为啥当路径满足时 NWPathMonitor 不给出路径更新?【英文标题】:Why does NWPathMonitor not give a path update when the path becomes satisfied?为什么当路径满足时 NWPathMonitor 不给出路径更新? 【发布时间】:2020-08-27 14:05:49 【问题描述】:

我有一个名为 NetworkPathMonitor 的简单类,如下所示:

class NetworkPathMonitor: ObservableObject, Cancellable 
    @Published var path: NWPath? = nil
    
    let monitor = NWPathMonitor()
    
    init() 
        monitor.pathUpdateHandler =  [weak self] path in
            DispatchQueue.main.async 
                self?.path = path
            
        
        monitor.start(queue: DispatchQueue.global(qos: .background))
    
    
    func cancel() 
        monitor.cancel()
    
    
    deinit 
        cancel()
    

虽然在我禁用和启用 WiFi 时会调用 pathUpdateHandler,但结果并不总是可靠的。当我禁用 WiFi 时,当前路径是 unsatisfied (No network route),但是当我再次启用 WiFi 时,它会再次使用相同的路径 unsatisfied (No network route) 调用 pathUpdateHandler

但是,在我的 UI 中,我有一个显示“重试”的按钮。当我按下它时,它将破坏当前的监视器并建立一个新的监视器。现在第一条消息显示satisfied (Path is satisfied), interface: en0。这意味着,WiFi 建立网络路由可能需要一些时间,但是当网络确实可用时,它没有再次调用 pathUpdateHandler

【问题讨论】:

【参考方案1】:

代码确实在真实设备上运行。

不要在 ios 模拟器上测试 NWPathMonitor,因为它不会给你一个可靠的结果。

【讨论】:

以上是关于为啥当路径满足时 NWPathMonitor 不给出路径更新?的主要内容,如果未能解决你的问题,请参考以下文章

Spark:仅当路径存在时才读取文件

当路径不包含驱动器号时,如何告诉编译器路径是绝对的

cookie的路径决定服务器在发送请求时候 是否决定发送 当路径匹配时候 则发送给服务器

为啥这个 SVG 投影过滤器在路径很短时会剪切路径?

如何将 PATH 环境变量替换为双引号 + 反斜杠那些在 C# 中有空格的变量?

如何将 NWPathMonitor 与 Alamofire 一起使用?