Created
December 21, 2016 15:47
-
-
Save brocoo/aaabf12c6c2b13d292f43c971ab91dfa to your computer and use it in GitHub Desktop.
Reactive extensions for RxSwift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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