Logo

RxReachability

GitHub release Version License Platform Build Status Test Coverage

RxReachability 为 ReachabilitySwift 添加了易于使用的 RxSwift 绑定。您可以对网络可达性变化做出反应,甚至在网络恢复时重试 observables。

可用 API

RxReachability 添加了以下 RxSwift 绑定

常用用法

1. 务必在您的 ViewController 或类似组件中存储 Reachability 的实例,并在 viewWillAppearviewWillDisappear 方法中启动/停止通知器。

class ViewController: UIViewController {

  let disposeBag = DisposeBag()
  var reachability: Reachability?

  override func viewDidLoad() {
    super.viewDidLoad()
    reachability = Reachability()
  }

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    try? reachability?.startNotifier()
  }

  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    reachability?.stopNotifier()
  }
}

2. 订阅任何绑定以了解何时发生更改。

extension ViewController {

  let disposeBag = DisposeBag()

  func bindReachability() {

    reachability?.rx.reachabilityChanged
      .subscribe(onNext: { reachability: Reachability in
        print("Reachability changed: \(reachability.currentReachabilityStatus)")
      })
      .disposed(by: disposeBag)

    reachability?.rx.status
      .subscribe(onNext: { status: Reachability.NetworkStatus in
        print("Reachability status changed: \(status)")
      })
      .disposed(by: disposeBag)

    reachability?.rx.isReachable
      .subscribe(onNext: { isReachable: Bool in
        print("Is reachable: \(isReachable)")
      })
      .disposed(by: disposeBag)

    reachability?.rx.isConnected
      .subscribe(onNext: {
        print("Is connected")
      })
      .disposed(by: disposeBag)

    reachability?.rx.isDisconnected
      .subscribe(onNext: {
        print("Is disconnected")
      })
      .disposed(by: disposeBag)
  }

静态用法

1. 务必在您的 AppDelegate 或类似组件中的某处存储 Reachability 的实例,并启动通知器。

import Reachability

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var reachability: Reachability?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    reachability = Reachability()
    try? reachability?.startNotifier()
    return true
  }
}

2. 订阅任何绑定以了解何时发生更改。

import Reachability
import RxReachability
import RxSwift

class ViewController: UIViewController {

  let disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()

    Reachability.rx.reachabilityChanged
      .subscribe(onNext: { reachability: Reachability in
        print("Reachability changed: \(reachability.currrentReachabilityStatus)")
      })
      .disposed(by: disposeBag)

    Reachability.rx.status
      .subscribe(onNext: { status: Reachability.NetworkStatus in
        print("Reachability status changed: \(status)")
      })
      .disposed(by: disposeBag)

    Reachability.rx.isReachable
      .subscribe(onNext: { isReachable: Bool in
        print("Is reachable: \(isReachable)")
      })
      .disposed(by: disposeBag)

    Reachability.rx.isConnected
      .subscribe(onNext: {
        print("Is connected")
      })
      .disposed(by: disposeBag)

    Reachability.rx.isDisconnected
      .subscribe(onNext: {
        print("Is disconnected")
      })
      .disposed(by: disposeBag)
  }

高级用法

使用 RxReachability,您还可以在网络恢复时添加重试,并设置给定的超时时间。但这确实需要您存储 Reachability 的实例。

func request(somethingId: Int) -> Observable<Something> {
  return network.request(.something(somethingId))
    .retryOnConnect(timeout: 30)
    .map { Something(JSON: $0) }
}

安装

通过 CocoaPods 安装

要使用 CocoaPods 将 RxReachability 集成到您的 Xcode 项目中,只需将以下行添加到您的 Podfile

pod 'RxReachability', '~> 1.2.1'

通过 Carthage 安装

要使用 Carthage 将 RxReachability 集成到您的 Xcode 项目中,只需将以下行添加到您的 Cartfile

github "RxSwiftCommunity/RxReachability" ~> 1.2.1

通过 Swift Package Manager (SPM) 安装

要使用 SPM 将 RxReachability 集成到您的 Xcode 项目中,只需将以下行添加到您的 Package.swift

.package(url: "https://github.com/RxSwiftCommunity/RxReachability", .upToNextMajor(from: "1.2.1")),

示例

要运行示例项目,请克隆 repo,并首先从 Example 目录运行 pod install

许可

此库属于 RxSwiftCommunity

RxReachability 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。