CombineReachability adds easy to use Combine publishers for ReachabilitySwift. It adds the ability to react to network reachability changes in a reactive way using the power of Combine. This library was inspired by the RxSwift Community's RxReachability library.
CombineReachability adds the following Combine publishers:
reachabilityChanged: AnyPublisher<Reachability, Never>
status: AnyPublisher<Reachability.Connection, Never>
isReachable: AnyPublisher<Bool, Never>
isConnected: AnyPublisher<Void, Never>
isDisconnected: AnyPublisher<Void, Never>
1. Be sure to store an instance of Reachability
, and start/stop the notifier by calling try? reachability?.startNotifier()
and reachability?.stopNotifier()
respectively.
class ViewController: UIViewController {
var subscriptions = Set<AnyCancellable>()
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()
}
}
extension ViewController {
func testReachability() {
reachability?.reachabilityChanged
.sink(receiveValue: { reachability: Reachability in
print("Reachability changed: \(reachability.currrentReachabilityStatus)")
})
.store(in: &subscriptions)
reachability?.status
.sink(receiveValue: { status: Reachability.NetworkStatus in
print("Reachability status changed: \(status)")
})
.store(in: &subscriptions)
reachability?.isReachable
.sink(receiveValue: { isReachable: Bool in
print("Is reachable: \(isReachable)")
})
.store(in: &subscriptions)
reachability?.isConnected
.sink(receiveValue: {
print("Is connected")
})
.store(in: &subscriptions)
reachability?.isDisconnected
.sink(receiveValue: {
print("Is disconnected")
})
.store(in: &subscriptions)
}
1. Be sure to store an instance of Reachability
somewhere on your AppDelegate
or similar, and start the notifier.
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
}
}
extension ViewController {
func testReachability() {
Reachability.reachabilityChanged
.sink(receiveValue: { reachability: Reachability in
print("Reachability changed: \(reachability.currrentReachabilityStatus)")
})
.store(in: &subscriptions)
Reachability.status
.sink(receiveValue: { status: Reachability.NetworkStatus in
print("Reachability status changed: \(status)")
})
.store(in: &subscriptions)
Reachability.isReachable
.sink(receiveValue: { isReachable: Bool in
print("Is reachable: \(isReachable)")
})
.store(in: &subscriptions)
Reachability.isConnected
.sink(receiveValue: {
print("Is connected")
})
.store(in: &subscriptions)
Reachability.isDisconnected
.sink(receiveValue: {
print("Is disconnected")
})
.store(in: &subscriptions)
}
Add the following line to your Podfile and run pod install
:
pod 'CombineReachability'
- In Xcode select
File/Swift Packages/Add Package Dependency...
- Paste
https://github.com/istvan-kreisz/CombineReachability.git
into the repository URL textfield.
CombineReachability is available under the MIT license. See the LICENSE file for more info.