Pull to refresh

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, в котором нет доступа к интернету?

+1)

залез в пост в поисках ответа на именно этот вопрос)

Sign up to leave a comment.

Articles