You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS13下Swift新手求助:如何在viewDidLoad中即时检测网络连接?

解决NWPathMonitor即时检测初始网络状态的问题

嘿,作为Swift/iOS新手,你遇到的这个问题很常见——NWPathMonitor默认只会在网络状态变化时触发pathUpdateHandler,不会在初始化后立刻告诉你当前的网络状态,所以viewDidLoad里的internetConnected还是初始的false,导致判断失效。

下面给你两种简单的解决方案,帮你在viewDidLoad时就能拿到当前网络状态:

方案1:直接获取当前网络路径状态

启动monitor后,你可以直接通过monitor.currentPath拿到当前的网络状态,不用等回调触发。先把状态判断逻辑抽成复用方法,再主动触发初始检测:

// 新增:抽离状态更新逻辑
private func updateNetworkStatus(with path: NWPath) {
    if path.status == .satisfied {
        print("dedalos-print INTERNET OK")
        if !self.internetConnected {
            self.internetConnected = true
            // 重要:UI操作必须在主队列执行
            DispatchQueue.main.async {
                self.loadWebView()
            }
        }
    } else {
        print("dedalos-print NO INTERNET")
        self.internetConnected = false
        DispatchQueue.main.async {
            self.loadHTMLerror()
        }
    }
}

// 修改loadView里的监控逻辑
override func loadView() {
    super.loadView()
    
    // ... 原有WebView初始化代码 ...
    
    // NETWORK MONITORING
    monitor.pathUpdateHandler = { path in
        self.updateNetworkStatus(with: path)
    }
    monitor.start(queue: queue)
    
    // 主动获取初始网络状态并更新
    let initialPath = monitor.currentPath
    updateNetworkStatus(with: initialPath)
}

这样启动监控后会立刻检测一次当前状态,viewDidLoad里的internetConnected就会是真实的网络状态值了。

方案2:手动触发一次pathUpdateHandler

另一种更直接的方式是,在启动monitor后,手动把当前路径传给pathUpdateHandler,让它执行一次初始化判断:

override func loadView() {
    super.loadView()
    
    // ... 原有WebView初始化代码 ...
    
    // NETWORK MONITORING
    monitor.pathUpdateHandler = { path in
        if path.status == .satisfied {
            print("dedalos-print INTERNET OK 1")
            if (!self.internetConnected) {
                self.internetConnected = true
                DispatchQueue.main.async {
                    self.loadWebView()
                }
            }
        } else {
            print("dedalos-print NO INTERNET 1")
            self.internetConnected = false
            DispatchQueue.main.async {
                self.loadHTMLerror()
            }
        }
    }
    monitor.start(queue: queue)
    
    // 手动触发一次handler,获取初始状态
    if let handler = monitor.pathUpdateHandler {
        handler(monitor.currentPath)
    }
}

关键注意点

你原来的代码里直接在后台队列调用loadWebView()和loadHTMLerror(),这会导致UI操作在非主队列执行,很可能引发崩溃或异常行为,一定要用DispatchQueue.main.async把这些UI相关的方法包裹起来!

修改后,viewDidLoad里的判断就能基于真实的初始网络状态执行对应逻辑了。

内容的提问来源于stack exchange,提问作者Stefano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:59:07