使用Alamofire检测iOS设备网络连接的技术问询
我来帮你完善这段Alamofire网络可达性检测的代码,同时补上几个容易踩坑的关键细节,让它在实际项目里更健壮可靠:
完善后的完整实现
import Alamofire class ReachabilityManager { // 单例模式,全局仅一个监听实例,避免资源浪费和状态冲突 static let shared = ReachabilityManager() private let networkReachabilityManager: NetworkReachabilityManager? // 定义状态回调的闭包类型,方便外部注册监听 typealias NetworkStatusCallback = (NetworkReachabilityManager.NetworkReachabilityStatus) -> Void private var statusCallbacks: [NetworkStatusCallback] = [] private init() { // 建议替换成你的后端服务域名,比检测Google更贴合业务实际 networkReachabilityManager = NetworkReachabilityManager(host: "www.your-service-domain.com") startListening() } private func startListening() { networkReachabilityManager?.listener = { [weak self] status in print("当前网络状态: \(status)") // 通知所有注册的外部回调 self?.statusCallbacks.forEach { $0(status) } switch status { case .notReachable: print("⚠️ 无网络连接") // 这里可以添加UI提示逻辑,比如弹出Toast、更新状态栏 case .reachable(let connectionType): print("✅ 网络可用,连接类型: \(connectionType)") // 网络恢复后的业务逻辑,比如自动重试请求、刷新页面数据 case .unknown: print("❓ 网络状态未知") // 未知状态建议做兼容处理,比如默认保留当前状态或提示用户检查网络 } } // 原代码漏掉了这关键一步!必须启动监听才会触发状态回调 networkReachabilityManager?.startListening() } // 提供外部注册状态监听的方法 func addStatusCallback(_ callback: @escaping NetworkStatusCallback) { statusCallbacks.append(callback) // 注册时立即返回当前网络状态,避免等待状态变化 if let currentStatus = networkReachabilityManager?.status { callback(currentStatus) } } // 移除所有回调,避免内存泄漏(比如页面销毁时调用) func removeAllCallbacks() { statusCallbacks.removeAll() } // 便捷获取当前网络状态 var currentStatus: NetworkReachabilityManager.NetworkReachabilityStatus? { return networkReachabilityManager?.status } }
关键改进说明
- 单例模式:用
static let shared保证全局只有一个监听实例,避免重复创建导致的资源浪费和状态不一致 - 启动监听:原代码缺失
startListening()调用,这是让监听逻辑生效的核心步骤,没有这一步完全不会触发状态回调 - 内存安全:在listener闭包中使用
[weak self]避免循环引用,防止内存泄漏 - 多场景监听支持:通过
statusCallbacks数组支持外部多处注册状态回调,比如多个ViewController都能收到网络变化通知 - 细分状态处理:把
.unknown状态单独处理,原代码将其和.reachable归为一类容易导致误判 - 业务贴合性:建议替换检测Host为你的后端域名,比检测Google更能反映用户是否能正常访问你的服务
使用示例(在ViewController中)
override func viewDidLoad() { super.viewDidLoad() // 注册网络状态监听 ReachabilityManager.shared.addStatusCallback { [weak self] status in guard let self = self else { return } switch status { case .notReachable: self.showNoNetworkTip() case .reachable: self.reloadPageData() case .unknown: self.showNetworkUnknownState() } } } // 页面销毁时移除回调,避免内存泄漏 deinit { ReachabilityManager.shared.removeAllCallbacks() }
内容的提问来源于stack exchange,提问作者Evgeniy Kleban
相关产品推荐
相关产品推荐

