Xcode11/Swift5中按钮触发前如何高效检测网络连接?
Hey there! Let's break this down for your specific use case.
First, to address your core question: since you only need to check the network connection once right before a button triggers a download, the continuous monitoring setup in your provided code isn't the most efficient choice for this scenario.
Why your current code isn't ideal here
The code you shared sets up a persistent NWPathMonitor that runs in a background queue, listening for every network state change. This is perfect if your app needs real-time network awareness (like showing a persistent "no internet" banner whenever connectivity drops), but for a single pre-download check, it's overkill—you're keeping a monitor running indefinitely when you only need one quick verification.
The more efficient solution: Single-time check on button tap
Instead of maintaining a permanent monitor, create a temporary NWPathMonitor only when the button is tapped, perform the check, then clean it up immediately. Here's a tailored example:
import Network import UIKit class ViewController: UIViewController { @IBAction func downloadButtonTapped(_ sender: UIButton) { // Create a temporary monitor just for this check let networkMonitor = NWPathMonitor() let checkQueue = DispatchQueue(label: "SingleNetworkCheckQueue") networkMonitor.pathUpdateHandler = { path in // Check if we have active internet let hasInternet = path.status == .satisfied // Clean up the monitor right after getting the result networkMonitor.cancel() // Switch back to main thread to update UI or start download DispatchQueue.main.async { if hasInternet { print("Connected—starting download!") self.startDownload() } else { print("No internet connection available.") self.showNoInternetAlert() } } } // Launch the monitor on the dedicated queue networkMonitor.start(queue: checkQueue) } private func startDownload() { // Your actual download logic goes here } private func showNoInternetAlert() { let alert = UIAlertController(title: "Oops!", message: "Please check your internet connection before downloading.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Got it", style: .default)) present(alert, animated: true) } }
Key benefits of this approach:
- Resource efficiency: The monitor only exists for the duration of the check, so it doesn't consume background resources when it's not needed.
- Cleaner code flow: The network check is tightly linked to the action that requires it (the button tap), making your code more readable and maintainable.
When to use your original continuous monitoring code
If your app later needs to react to network changes throughout its lifecycle (e.g., automatically retry downloads when connectivity returns, or show persistent offline warnings), then your original code is a solid implementation. It's just not the best fit for a single, one-off check.
内容的提问来源于stack exchange,提问作者user13332990

