6a5eaaae846a944e45c2084109771f96
SwiftUI 网络请求组件之 使用Combin观察iOS应用程序网络连接状态(中文教程含视频源吗)

实战需求

SwiftUI 网络请求组件之 使用Combin观察iOS应用程序网络连接状态(中文教程含视频源吗)

本文价值与收获

看完本文后,您将能够作出下面的界面

SwiftUI 网络请求组件

SwiftUI 网络请求组件

看完本文您将掌握的技能

  • 如何创建一个自定义的可重用的 Combine 发布者NWPathMonitor,用于观察网络状态的组件。
  • 如何将网络状态更新绑定到 SwiftUI 中的 UI 元素。

实战代码

首先,让我们导入 Network 和 Combine 框架并在 上定义扩展NWPathMonitor:

import Network
import Combine

extension NWPathMonitor {

}

现在我们需要实现一个Subscription:

import Network
import Combine

// MARK: - NWPathMonitor Subscription
extension NWPathMonitor {
    class NetworkStatusSubscription<S: Subscriber>: Subscription where S.Input == NWPath.Status {

      // 1
      private let subscriber: S?

      // 2
      private let monitor: NWPathMonitor
      private let queue: DispatchQueue

      init(subscriber: S,
           monitor: NWPathMonitor,
           queue: DispatchQueue) {

          self.subscriber = subscriber
          self.monitor = monitor
          self.queue = queue
      }

      // 3
      func request(_ demand: Subscribers.Demand) {

       }

      func cancel() {

       }

    }
}
  • 我们依赖于Subscriber接受NWPath.Status作为输入的 a。
  • 我们还建立monitor和queue依赖关系,所以我们可以在晚些时候推出网络监控进程。
  • 为了符合Subscription协议,我们实现了request(_ demand:)和cancel()方法。在request方法内部,我们将启动监控过程。在里面cancel,我们会在必要时取消这个过程。

让我们更新request和cancel方法如下:

import Network
import Combine

// MARK: - NWPathMonitor Subscription
extension NWPathMonitor {
    class NetworkStatusSubscription<S: Subscriber>: Subscription where S.Input == NWPath.Status {

      ...

      func request(_ demand: Subscribers.Demand) {
          // 1
          monitor.pathUpdateHandler = { [weak self] path in
              guard let self = self else { return }
              _ = self.subscriber?.receive(path.status)
          }

          // 2
          monitor.start(queue: queue)
      }

      func cancel() {
          // 3
          monitor.cancel()
      }

    }
}
  • 我们使用该pathUpdateHandler属性来接收NWPath包含当前网络状态的信息。一旦状态发生变化,aSubscriber将收到一个NWPath.Status值。
  • 我们开始监控过程,以便我们能够获得pathUpdateHandler闭包内的状态变化。
  • 在cancel()方法内部,一旦取消订阅,我们将相应地禁用监控过程。

随着Subscription做,现在我们将延长NWPathMonitor一个更多的时间来创建自定义Publisher:
```
import Network
import Combine

// MARK: - NWPathMonitor Subscription
extension NWPathMonitor {
...
}

// MARK: - NWPathMonitor Publisher
extension NWPathMonitor {
// 1
struct NetworkStatusPublisher: Publisher {

    // 2
    typealias Output = NWPath.Status
    typealias Failure = Never

    // 3
    private let monitor: NWPathMonitor
top Created with Sketch.