Skip to content

Instantly share code, notes, and snippets.

@thebarndog
Created May 24, 2016 04:29
Show Gist options
  • Save thebarndog/e538f15cca0adcd0e397d33129074687 to your computer and use it in GitHub Desktop.
Save thebarndog/e538f15cca0adcd0e397d33129074687 to your computer and use it in GitHub Desktop.
Reactive UIViewController
class BaseViewController: UIViewController {
// MARK: - Observers
// MARK: View Trigger Observers
private let viewWillAppearObserver: Signal<Void, NoError>.Observer
private let viewDidAppearObserver: Signal<Void, NoError>.Observer
private let viewWillDisappearObserver: Signal<Void, NoError>.Observer
private let viewDidDisappearObserver: Signal<Void, NoError>.Observer
// MARK: - Producers
// MARK: View Event Producers
private let viewWillAppearProducer: SignalProducer<Void, NoError>
private let viewDidAppearProducer: SignalProducer<Void, NoError>
private let viewWillDisappearProducer: SignalProducer<Void, NoError>
private let viewDidDisappearProducer: SignalProducer<Void, NoError>
// MARK: - Signals
lazy var viewWillAppearSignal: Signal<Void, NoError> = { [unowned self] in
var extractedSignal: Signal<Void, NoError>!
self.viewWillAppearProducer.startWithSignal { signal, _ in
extractedSignal = signal
}
return extractedSignal
}()
lazy var viewDidAppearSignal: Signal<Void, NoError> = { [unowned self] in
var extractedSignal: Signal<Void, NoError>!
self.viewDidAppearProducer.startWithSignal { signal, _ in
extractedSignal = signal
}
return extractedSignal
}()
lazy var viewWillDisappearSignal: Signal<Void, NoError> = { [unowned self] in
var extractedSignal: Signal<Void, NoError>!
self.viewWillDisappearProducer.startWithSignal { signal, _ in
extractedSignal = signal
}
return extractedSignal
}()
lazy var viewDidDisappearSignal: Signal<Void, NoError> = { [unowned self] in
var extractedSignal: Signal<Void, NoError>!
self.viewDidDisappearProducer.startWithSignal { signal, _ in
extractedSignal = signal
}
return extractedSignal
}()
// MARK: - Initialization
required init?(coder aDecoder: NSCoder) {
(viewWillAppearProducer, viewWillAppearObserver) = SignalProducer.buffer(1)
(viewDidAppearProducer, viewDidAppearObserver) = SignalProducer.buffer(1)
(viewWillDisappearProducer, viewWillDisappearObserver) = SignalProducer.buffer(1)
(viewDidDisappearProducer, viewDidDisappearObserver) = SignalProducer.buffer(1)
super.init(coder: aDecoder)
}
}
extension BaseViewController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
viewWillAppearObserver.sendNext()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
viewDidAppearObserver.sendNext()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
viewWillDisappearObserver.sendNext()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
viewDidDisappearObserver.sendNext()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment