Comments 3
NotificationCenter
кажется разумным улучшением, но это стремление что-то куда-то непременно заинкапсулировать регулярно вызывает во мне печаль.
Почему не использовать NWMonitor
напрямую? В Apple уже и так достаточно постарались, чтобы предоставить высокоуровневый интерфейс для решения задачи отслеживания состояния соединения. Зачем этот дополнительный объект, который ограничивает доступный API, и только и делает, что проксирует свой публичный интерфейс в инстанс NWMonitor
? Причём даже не скрывает того, что работает с Network Framework
, т.к. возвращает NWInterface.InterfaceType
. Зачем усложнять себе жизнь, делая эти бесконечные врапперы и менеджеры?
Я бы сократил весь код до:
extension NSNotification.Name {
static let networkMonitorPathUpdated = NSNotification.Name("NWNetworkMonitorPathUpdated")
}
extension NWPath {
var isConnected: Bool {
status != .unsatisfied
}
}
// где-нибудь в коде приложения:
let mySharedNetworkMonitor = NWPathMonitor(requiredInterfaceType: <...>)
mySharedNetworkMonitor.pathUpdateHandler = { _ in
NotificationCenter.shared.post(name: .networkMonitorPathUpdated,
object: mySharedNetworkMonitor)
// ... и даже наплевать на retain-cycle, т.к. судя по статье
// этот объект всё равно собирался жить вечно как static var shared = ...
}
// Зачем нужна какая-то особая очередь для получения этих уведомлений,
// мне тоже не понятно. Всё равно реагировать на эти события в большинстве случаев придётся в UI.
mySharedNetworkMonitor.start(queue: .main)
// Не представляю в какой момент и зачем кому-то захочется сделать stop.
// Но если очень хочется, то можно:
mySharedNetworkMonitor.stop()
NotificationCenter.shared
.addObserver(forName: .networkMonitorPathUpdated,
object: mySharedNetworkMonitor,
queue: .main) { note in
// если монитор всегда один,
// то можно читать прям из mySharedNetworkMonitor
let monitor = note.object as! NWPathMonitor
// читаем прямо из NWPathMonitor, используя Network API на 100%
print("connected:", monitor.currentPath.isConnected)
}
// любителям Combine:
import Combine
extension NWPathMonitor {
var pathUpdatePublisher: AnyPublisher<NWPath, Never> {
NotificationCenter()
.publisher(for: .networkMonitorPathUpdated, object: self)
.map { ($0.object as! NWPathMonitor).currentPath }
.eraseToAnyPublisher()
}
}
mySharedNetworkMonitor.pathUpdatePublisher
.map(\.isConnected)
.sink { connected in
print("connected: ", connected)
}
// ... можно было бы ещё подзаморочиться, и делать `start`
// в момент, когда появляетсяс первый подписчик,
// но это уже слишком хорошо
Как в данной реализации отслеживать ситуацию с подключением к Wi-Fi, в котором нет доступа к интернету?
Как отследить состояние сетевого соединения в Swift? Привет, нативная реализация, пока, Reachability