An observer that you use to monitor and react to network changes.
- 네트워크 변화를 감지해 전달해주는 클래스
- iOS 14부터 사용 가능
Creating Path Monitors
func start(queue: DispatchQueue)
- Starts monitoring path changes, and sets a queue on which to deliver path events
- 모니터를 시작하는 함수
var queue: DispatchQueue?
- The Queue on which path events are delivered
- path events를 전달하기 위한 큐
Handling Path Updates
var currentPath: NWPath
- The currently available network path observed by the path monitor
var pathUpdateHandler: (NWPath) → Void)?
- A handler that receives network path updates.
- 네트워크 패스의 업데이트 사항을 전달받는 핸들러
Canceling Path Monitors
func cancel()
- Stops receiving network path updates
- 업데이트 패스를 받는 행위를 취소하기 위한 함수
enum NetworkType {
case wifi
case cellular
case wiredEthernet
case loopback
case other
}
enum NetworkStatus {
case satisfied(NetworkType)
case unsatisfied
case requiresConnection
}
protocol NetworkManagerProtocol {
var networkStatusPublisher: PassthroughSubject<NetworkStatus, Never> { get }
func startMonitor()
func stopMonitor()
}
final class NetworkManager {
static let shared: NetworkManager = NetworkManager()
var networkStatusPublisher: PassthroughSubject<NetworkStatus, Never> = .init()
private let nwPathMonitor = NWPathMonitor()
private let queue = DispatchQueue.global() // 이벤트를 백그라운드에서 처리하기 위해 global queue로 선언
private init() {
self.startMonitor()
}
}
extension NetworkManager: NetworkManagerProtocol {
func startMonitor() {
self.nwPathMonitor.pathUpdateHandler = { [weak self] path in
switch path.status {
case .satisfied:
if path.usesInterfaceType(.wifi) {
self?.networkStatusPublisher.send(.satisfied(.wifi))
} else if path.usesInterfaceType(.cellular) {
self?.networkStatusPublisher.send(.satisfied(.cellular))
} else if path.usesInterfaceType(.wiredEthernet) {
self?.networkStatusPublisher.send(.satisfied(.wiredEthernet))
} else if path.usesInterfaceType(.loopback) {
self?.networkStatusPublisher.send(.satisfied(.loopback))
} else {
self?.networkStatusPublisher.send(.satisfied(.other))
}
case .unsatisfied:
self?.networkStatusPublisher.send(.unsatisfied)
case .requiresConnection:
self?.networkStatusPublisher.send(.requiresConnection)
@unknown default:
self?.networkStatusPublisher.send(.unsatisfied)
}
}
self.nwPathMonitor.start(queue: queue)
}
func stopMonitor() {
self.nwPathMonitor.cancel()
}
}
- 샘플앱에는 토스트 라는 뷰를 만들어 정상적인 상태가 아닐 때에는 해당 뷰를 보여주는 형태로 구성되어 있다.
Github
https://github.com/davidyoon891122/NWPathMonitorSample
참조
https://developer.apple.com/documentation/network/nwpathmonitor
'iOS > Swift' 카테고리의 다른 글
| UIBackgroundTaskIdentifier (0) | 2024.05.20 |
|---|---|
| UnsafePointer (0) | 2024.05.08 |
| UnsafePointer (0) | 2024.04.29 |
| Singleton Pattern (0) | 2024.04.15 |
| CombineLatest Vs Zip (0) | 2024.04.08 |