Skip to content

Instantly share code, notes, and snippets.

@brocoo
Created December 21, 2016 15:47
Show Gist options
  • Save brocoo/aaabf12c6c2b13d292f43c971ab91dfa to your computer and use it in GitHub Desktop.
Save brocoo/aaabf12c6c2b13d292f43c971ab91dfa to your computer and use it in GitHub Desktop.
Reactive extensions for RxSwift
import RxCocoa
import RxSwift
// MARK: - Reactive protocol
protocol ReactiveDisposable {
var disposeBag: DisposeBag { get }
}
// MARK: - Reactive extensions
extension Reactive where Base: UIScrollView {
// MARK: - UIScrollView reactive extension
public var reachedBottom: Observable<Void> {
let scrollView = self.base as UIScrollView
return self.contentOffset.flatMap{ [weak scrollView] (contentOffset) -> Observable<Void> in
guard let scrollView = scrollView else { return Observable.empty() }
let visibleHeight = scrollView.frame.height - self.base.contentInset.top - scrollView.contentInset.bottom
let y = contentOffset.y + scrollView.contentInset.top
let threshold = max(0.0, scrollView.contentSize.height - visibleHeight)
return (y > threshold) ? Observable.just(()) : Observable.empty()
}
}
public var startedDragging: Observable<Void> {
let scrollView = self.base as UIScrollView
return scrollView.panGestureRecognizer.rx
.event
.filter({ $0.state == .began })
.map({ _ in () })
}
}
extension Reactive where Base: UIViewController {
// MARK: - UIViewController reactive extension
public var viewDidLoad: Observable<Void> {
return self.sentMessage(#selector(UIViewController.viewDidLoad)).map({ _ in return () })
}
public var viewWillAppear: Observable<Bool> {
return self.sentMessage(#selector(UIViewController.viewWillAppear(_:))).map({ $0.first as! Bool })
}
public var viewDidAppear: Observable<Bool> {
return self.sentMessage(#selector(UIViewController.viewDidAppear(_:))).map({ $0.first as! Bool })
}
public var viewWillDisappear: Observable<Bool> {
return self.sentMessage(#selector(UIViewController.viewWillDisappear(_:))).map({ $0.first as! Bool })
}
public var viewDidDisappear: Observable<Bool> {
return self.sentMessage(#selector(UIViewController.viewDidDisappear(_:))).map({ $0.first as! Bool })
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment