Merge branch 'swift-3.0-removing-rx_-prefix' of https://github.com/JegnuX/RxSwift into JegnuX-swift-3.0-removing-rx_-prefix

This commit is contained in:
Krunoslav Zaher 2016-08-19 00:45:51 +02:00
commit 9ce054936d
123 changed files with 1267 additions and 1212 deletions

View File

@ -102,13 +102,13 @@ Creating new operators is also pretty straightforward.
```swift
extension NSObject {
extension Reactive where Base: NSObject {
public var rx_deallocated: Observable<Void> {}
public var deallocated: Observable<Void> {}
#if !DISABLE_SWIZZLING
public var rx_deallocating: Observable<Void> {}
public var deallocating: Observable<Void> {}
#endif
@ -118,9 +118,9 @@ extension NSObject {
```swift
extension NSObject {
extension Reactive where Base: NSObject {
public func rx_observe<Element>(
public func observe<Element>(
type: E.Type,
_ keyPath: String,
options: NSKeyValueObservingOptions = .New | .Initial,
@ -129,7 +129,7 @@ extension NSObject {
#if !DISABLE_SWIZZLING
public func rx_observeWeakly<Element>(
public func observeWeakly<Element>(
type: E.Type,
_ keyPath: String,
options: NSKeyValueObservingOptions = .New | .Initial
@ -140,23 +140,23 @@ extension NSObject {
```
```swift
extension NSURLSession {
extension Reactive where Base: NSURLSession {
public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {}
public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {}
public func rx_data(request: NSURLRequest) -> Observable<NSData> {}
public func data(request: NSURLRequest) -> Observable<NSData> {}
public func rx_JSON(request: NSURLRequest) -> Observable<AnyObject> {}
public func JSON(request: NSURLRequest) -> Observable<AnyObject> {}
public func rx_JSON(URL: NSURL) -> Observable<AnyObject> {}
public func JSON(URL: NSURL) -> Observable<AnyObject> {}
}
```
```swift
extension NSNotificationCenter {
extension Reactive where Base: NSNotificationCenter {
public func rx_notification(name: String, object: AnyObject?) -> Observable<NSNotification> {}
public func notification(name: String, object: AnyObject?) -> Observable<NSNotification> {}
}
```
@ -170,39 +170,39 @@ class DelegateProxy {
```
```swift
extension CLLocationManager {
extension Reactive where Base: CLLocationManager {
public var rx_delegate: DelegateProxy {}
public var delegate: DelegateProxy {}
public var rx_didUpdateLocations: Observable<[CLLocation]> {}
public var didUpdateLocations: Observable<[CLLocation]> {}
public var rx_didFailWithError: Observable<NSError> {}
public var didFailWithError: Observable<NSError> {}
public var rx_didFinishDeferredUpdatesWithError: Observable<NSError> {}
public var didFinishDeferredUpdatesWithError: Observable<NSError> {}
public var rx_didPauseLocationUpdates: Observable<Void> {}
public var didPauseLocationUpdates: Observable<Void> {}
public var rx_didResumeLocationUpdates: Observable<Void> {}
public var didResumeLocationUpdates: Observable<Void> {}
public var rx_didUpdateHeading: Observable<CLHeading> {}
public var didUpdateHeading: Observable<CLHeading> {}
public var rx_didEnterRegion: Observable<CLRegion> {}
public var didEnterRegion: Observable<CLRegion> {}
public var rx_didExitRegion: Observable<CLRegion> {}
public var didExitRegion: Observable<CLRegion> {}
public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {}
public var didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {}
public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {}
public var monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {}
public var rx_didStartMonitoringForRegion: Observable<CLRegion> {}
public var didStartMonitoringForRegion: Observable<CLRegion> {}
public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {}
public var didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {}
public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {}
public var rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {}
public var rx_didVisit: Observable<CLVisit> {}
public var didVisit: Observable<CLVisit> {}
public var rx_didChangeAuthorizationStatus: Observable<CLAuthorizationStatus> {}
public var didChangeAuthorizationStatus: Observable<CLAuthorizationStatus> {}
}
```
@ -211,281 +211,281 @@ extension CLLocationManager {
```swift
extension UIControl {
extension Reactive where Base: UIControl {
public func rx_controlEvent(controlEvents: UIControlEvents) -> ControlEvent<Void> {}
public func controlEvent(controlEvents: UIControlEvents) -> ControlEvent<Void> {}
public var rx_enabled: ObserverOf<Bool> {}
public var enabled: ObserverOf<Bool> {}
}
```
```swift
extension UIButton {
extension Reactive where Base: UIButton {
public var rx_tap: ControlEvent<Void> {}
public var tap: ControlEvent<Void> {}
}
```
```swift
extension UITextField {
extension Reactive where Base: UITextField {
public var rx_text: ControlProperty<String> {}
public var text: ControlProperty<String> {}
}
```
```swift
extension UITextView {
extension Reactive where Base: UITextView {
override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {}
override func createDelegateProxy() -> RxScrollViewDelegateProxy {}
public var rx_text: ControlProperty<String> {}
public var text: ControlProperty<String> {}
}
```
```swift
extension UISearchBar {
extension Reactive where Base: UISearchBar {
public var rx_delegate: DelegateProxy {}
public var delegate: DelegateProxy {}
public var rx_searchText: ControlProperty<String> {}
public var searchText: ControlProperty<String> {}
}
```
```swift
extension UILabel {
extension Reactive where Base: UILabel {
public var rx_text: ObserverOf<String> {}
public var text: ObserverOf<String> {}
}
```
```swift
extension UIDatePicker {
extension Reactive where Base: UIDatePicker {
public var rx_date: ControlProperty<NSDate> {}
public var date: ControlProperty<NSDate> {}
}
```
```swift
extension UIImageView {
extension Reactive where Base: UIImageView {
public var rx_image: ObserverOf<UIImage!> {}
public var image: ObserverOf<UIImage!> {}
public func rx_imageAnimated(transitionType: String?) -> AnyObserver<UIImage?>
public func imageAnimated(transitionType: String?) -> AnyObserver<UIImage?>
}
```
```swift
extension UIScrollView {
extension Reactive where Base: UIScrollView {
public var rx_delegate: DelegateProxy {}
public var delegate: DelegateProxy {}
public func rx_setDelegate(delegate: UIScrollViewDelegate) {}
public func setDelegate(delegate: UIScrollViewDelegate) {}
public var rx_contentOffset: ControlProperty<CGPoint> {}
public var contentOffset: ControlProperty<CGPoint> {}
}
```
```swift
extension UIBarButtonItem {
extension Reactive where Base: UIBarButtonItem {
public var rx_tap: ControlEvent<Void> {}
public var tap: ControlEvent<Void> {}
}
```
```swift
extension UISlider {
extension Reactive where Base: UISlider {
public var rx_value: ControlProperty<Float> {}
public var value: ControlProperty<Float> {}
}
```
```swift
extension UITableView {
extension Reactive where Base: UITableView {
public var rx_dataSource: DelegateProxy {}
public var dataSource: DelegateProxy {}
public func rx_setDataSource(dataSource: UITableViewDataSource) -> Disposable {}
public func setDataSource(dataSource: UITableViewDataSource) -> Disposable {}
public func rx_itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {}
public func itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {}
public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {}
public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {}
public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {}
public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {}
public var rx_itemSelected: ControlEvent<IndexPath> {}
public var itemSelected: ControlEvent<IndexPath> {}
public var rx_itemDeselected: ControlEvent<IndexPath> {}
public var itemDeselected: ControlEvent<IndexPath> {}
public var rx_itemInserted: ControlEvent<IndexPath> {}
public var itemInserted: ControlEvent<IndexPath> {}
public var rx_itemDeleted: ControlEvent<IndexPath> {}
public var itemDeleted: ControlEvent<IndexPath> {}
public var rx_itemMoved: ControlEvent<ItemMovedEvent> {}
public var itemMoved: ControlEvent<ItemMovedEvent> {}
// This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func rx_modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func rx_modelDeselected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func modelDeselected<T>(modelType: T.Type) -> ControlEvent<T> {}
}
```
```swift
extension UICollectionView {
extension Reactive where Base: UICollectionView {
public var rx_dataSource: DelegateProxy {}
public var dataSource: DelegateProxy {}
public func rx_setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {}
public func setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {}
public func rx_itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {}
public func itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {}
public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {}
public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {}
public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {}
public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {}
public var rx_itemSelected: ControlEvent<IndexPath> {}
public var itemSelected: ControlEvent<IndexPath> {}
public var rx_itemDeselected: ControlEvent<IndexPath> {}
public var itemDeselected: ControlEvent<IndexPath> {}
// This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func rx_modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func rx_modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
// This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType`
public func modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
}
```
```swift
extension UIGestureRecognizer {
extension Reactive where Base: UIGestureRecognizer {
public var rx_event: ControlEvent<UIGestureRecognizer> {}
public var event: ControlEvent<UIGestureRecognizer> {}
}
```
```swift
extension UIImagePickerController {
extension Reactive where Base: UIImagePickerController {
public var rx_didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {}
public var didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {}
public var rx_didCancel: Observable<()> {}
public var didCancel: Observable<()> {}
}
```
```swift
extension UISegmentedControl {
extension Reactive where Base: UISegmentedControl {
public var rx_value: ControlProperty<Int> {}
public var value: ControlProperty<Int> {}
}
```
```swift
extension UISwitch {
extension Reactive where Base: UISwitch {
public var rx_value: ControlProperty<Bool> {}
public var value: ControlProperty<Bool> {}
}
```
```swift
extension UIActivityIndicatorView {
extension Reactive where Base: UIActivityIndicatorView {
public var rx_animating: AnyObserver<Bool> {}
public var animating: AnyObserver<Bool> {}
}
```
```swift
extension UINavigationItem {
extension Reactive where Base: UINavigationItem {
public var rx_title: AnyObserver<String?> {}
public var title: AnyObserver<String?> {}
}
```
**OSX**
```swift
extension NSControl {
extension Reactive where Base: NSControl {
public var rx_controlEvent: ControlEvent<()> {}
public var controlEvent: ControlEvent<()> {}
public var rx_enabled: AnyObserver<Bool> {}
public var enabled: AnyObserver<Bool> {}
}
```
```swift
extension NSSlider {
extension Reactive where Base: NSSlider {
public var rx_value: ControlProperty<Double> {}
public var value: ControlProperty<Double> {}
}
```
```swift
extension NSButton {
extension Reactive where Base: NSButton {
public var rx_tap: ControlEvent<Void> {}
public var tap: ControlEvent<Void> {}
public var rx_state: ControlProperty<Int> {}
public var state: ControlProperty<Int> {}
}
```
```swift
extension NSImageView {
extension Reactive where Base: NSImageView {
public var rx_image: ObserverOf<NSImage?> {}
public var image: ObserverOf<NSImage?> {}
public func rx_imageAnimated(transitionType: String?) -> AnyObserver<NSImage?>
public func imageAnimated(transitionType: String?) -> AnyObserver<NSImage?>
}
```
```swift
extension NSTextField {
extension Reactive where Base: NSTextField {
public var rx_delegate: DelegateProxy {}
public var delegate: DelegateProxy {}
public var rx_text: ControlProperty<String> {}
public var text: ControlProperty<String> {}
}
```
```swift
extension UITabBarItem {
extension Reactive where Base: UITabBarItem {
public var rx_badgeValue: AnyObserver<String?> {}
public var badgeValue: AnyObserver<String?> {}
}
```
```swift
extension UITabBar {
extension Reactive where Base: UITabBar {
public var rx_didSelectItem: ControlEvent<UITabBarItem> {}
public var didSelectItem: ControlEvent<UITabBarItem> {}
public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var rx_willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
public var willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
public var rx_didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
public var didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
}
```

View File

@ -72,17 +72,17 @@ b.value = -8 // doesn't print anything
## Simple UI bindings
* Instead of binding to variables, let's bind to `UITextField` values using the `rx_text` property
* Instead of binding to variables, let's bind to `UITextField` values using the `rx.text` property
* Next, `map` the `String` into an `Int` and determine if the number is prime using an async API
* If the text is changed before the async call completes, a new async call will replace it via `concat`
* Bind the results to a `UILabel`
```swift
let subscription/*: Disposable */ = primeTextField.rx_text // type is Observable<String>
let subscription/*: Disposable */ = primeTextField.rx.text // type is Observable<String>
.map { WolframAlphaIsPrime(Int($0) ?? 0) } // type is Observable<Observable<Prime>>
.concat() // type is Observable<Prime>
.map { "number \($0.n) is prime? \($0.isPrime)" } // type is Observable<String>
.bindTo(resultLabel.rx_text) // return Disposable that can be used to unbind everything
.bindTo(resultLabel.rx.text) // return Disposable that can be used to unbind everything
// This will set `resultLabel.text` to "number 43 is prime? true" after
// server call completes.
@ -108,7 +108,7 @@ Let's give it a shot.
```swift
// bind UI control values directly
// use username from `usernameOutlet` as username values source
self.usernameOutlet.rx_text
self.usernameOutlet.rx.text
.map { username in
// synchronous validation, nothing special here

View File

@ -208,7 +208,7 @@ Additional way to automatically dispose subscription on dealloc is to use `takeU
```swift
sequence
.takeUntil(self.rx_deallocated)
.takeUntil(self.rx.deallocated)
.subscribe {
print($0)
}
@ -554,8 +554,8 @@ Behavior for URL observables is equivalent.
This is how HTTP requests are wrapped in Rx. It's pretty much the same pattern like the `interval` operator.
```swift
extension NSURLSession {
public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {
extension Reactive where Base: NSURLSession {
public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {
return Observable.create { observer in
let task = self.dataTaskWithRequest(request) { (data, response, error) in
guard let response = response, data = data else {
@ -933,14 +933,14 @@ There are two built in ways this library supports KVO.
```swift
// KVO
extension NSObject {
public func rx_observe<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable<E?> {}
extension Reactive where Base: NSObject {
public func observe<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable<E?> {}
}
#if !DISABLE_SWIZZLING
// KVO
extension NSObject {
public func rx_observeWeakly<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable<E?> {}
extension Reactive where Base: NSObject {
public func observeWeakly<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable<E?> {}
}
#endif
```
@ -951,7 +951,7 @@ Example how to observe frame of `UIView`.
```swift
view
.rx_observe(CGRect.self, "frame")
.rx.observe(CGRect.self, "frame")
.subscribe(onNext: { frame in
...
})
@ -961,15 +961,15 @@ or
```swift
view
.rx_observeWeakly(CGRect.self, "frame")
.rx.observeWeakly(CGRect.self, "frame")
.subscribe(onNext: { frame in
...
})
```
### `rx_observe`
### `rx.observe`
`rx_observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios
`rx.observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios
* it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`)
* it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)
@ -978,14 +978,14 @@ view
E.g.
```swift
self.rx_observe(CGRect.self, "view.frame", retainSelf: false)
self.rx.observe(CGRect.self, "view.frame", retainSelf: false)
```
### `rx_observeWeakly`
### `rx.observeWeakly`
`rx_observeWeakly` has somewhat slower than `rx_observe` because it has to handle object deallocation in case of weak references.
`rx.observeWeakly` has somewhat slower than `rx.observe` because it has to handle object deallocation in case of weak references.
It can be used in all cases where `rx_observe` can be used and additionally
It can be used in all cases where `rx.observe` can be used and additionally
* because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown
* it can be used to observe `weak` properties
@ -993,7 +993,7 @@ It can be used in all cases where `rx_observe` can be used and additionally
E.g.
```swift
someSuspiciousViewController.rx_observeWeakly(Bool.self, "behavingOk")
someSuspiciousViewController.rx.observeWeakly(Bool.self, "behavingOk")
```
### Observing structs
@ -1004,7 +1004,7 @@ KVO is an Objective-C mechanism so it relies heavily on `NSValue`.
When observing some other structures it is necessary to extract those structures from `NSValue` manually.
[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx_observe*` methods for other structs by implementing `KVORepresentable` protocol.
[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx.observe*` methods for other structs by implementing `KVORepresentable` protocol.
## UI layer tips
@ -1070,7 +1070,7 @@ let request = NSURLRequest(URL: NSURL(string: "http://en.wikipedia.org/w/api.php
If you want to just execute that request outside of composition with other observables, this is what needs to be done.
```swift
let responseJSON = NSURLSession.sharedSession().rx_JSON(request)
let responseJSON = NSURLSession.sharedSession().rx.JSON(request)
// no requests will be performed up to this point
// `responseJSON` is just a description how to fetch the response
@ -1093,7 +1093,7 @@ cancelRequest.dispose()
In case you want a more low level access to response, you can use:
```swift
NSURLSession.sharedSession().rx_response(myNSURLRequest)
NSURLSession.sharedSession().rx.response(myNSURLRequest)
.debug("my request") // this will print out information to console
.flatMap { (data: NSData!, response: NSURLResponse!) -> Observable<String> in
if let response = response as? NSHTTPURLResponse {

View File

@ -164,7 +164,7 @@ E.g.
This is a typical beginner example.
```swift
let results = query.rx_text
let results = query.rx.text
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
@ -172,11 +172,11 @@ let results = query.rx_text
results
.map { "\($0.count)" }
.bindTo(resultCount.rx_text)
.bindTo(resultCount.rx.text)
.addDisposableTo(disposeBag)
results
.bindTo(resultsTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in
.bindTo(resultsTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.addDisposableTo(disposeBag)
@ -195,7 +195,7 @@ So, what are the problems with this code?:
A more appropriate version of the code would look like this:
```swift
let results = query.rx_text
let results = query.rx.text
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
@ -207,11 +207,11 @@ let results = query.rx_text
results
.map { "\($0.count)" }
.bindTo(resultCount.rx_text)
.bindTo(resultCount.rx.text)
.addDisposableTo(disposeBag)
results
.bindTo(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in
.bindTo(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.addDisposableTo(disposeBag)
@ -222,7 +222,7 @@ Making sure all of these requirements are properly handled in large systems can
The following code looks almost the same:
```swift
let results = query.rx_text.asDriver() // This converts a normal sequence into a `Driver` sequence.
let results = query.rx.text.asDriver() // This converts a normal sequence into a `Driver` sequence.
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
@ -231,11 +231,11 @@ let results = query.rx_text.asDriver() // This converts a normal sequence
results
.map { "\($0.count)" }
.drive(resultCount.rx_text) // If there is a `drive` method available instead of `bindTo`,
.drive(resultCount.rx.text) // If there is a `drive` method available instead of `bindTo`,
.addDisposableTo(disposeBag) // that means that the compiler has proven that all properties
// are satisfied.
results
.drive(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in
.drive(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.addDisposableTo(disposeBag)
@ -246,7 +246,7 @@ So what is happening here?
This first `asDriver` method converts the `ControlProperty` unit to a `Driver` unit.
```swift
query.rx_text.asDriver()
query.rx.text.asDriver()
```
Notice that there wasn't anything special that needed to be done. `Driver` has all of the properties of the `ControlProperty` unit, plus some more. The underlying observable sequence is just wrapped as a `Driver` unit, and that's it.

View File

@ -55,7 +55,7 @@ _ = xs
.filter { ... }
.map { ... }
.switchLatest()
.takeUntil(someObject.rx_deallocated) // <-- note the `takeUntil` operator
.takeUntil(someObject.deallocated) // <-- note the `takeUntil` operator
.subscribe(onNext: {
...
}, onError: {

View File

@ -77,7 +77,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
</tr>
<tr>
<td><div class="highlight highlight-source-swift"><pre>
let searchResults = searchBar.rx_text
let searchResults = searchBar.rx.text
.throttle(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { query -> Observable<[Repository]> in
@ -96,7 +96,7 @@ let searchResults = searchBar.rx_text
<tr>
<td width="30%"><div class="highlight highlight-source-swift"><pre>
searchResults
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell")) {
.bindTo(tableView.rx.itemsWithCellIdentifier("Cell")) {
(index, repository: Repository, cell) in
cell.textLabel?.text = repository.name
cell.detailTextLabel?.text = repository.url

View File

@ -66,6 +66,7 @@
84E4D3931C9AFD3500ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
84E4D3941C9AFD3600ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; };
84E4D3961C9B011000ADFDC9 /* UISearchController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */; };
87379AE01D61C6F50047CA88 /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F461001CD7ABE400527B4D /* Reactive.swift */; };
88718CFE1CE5D80000D88D60 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */; };
88718CFF1CE5D80000D88D60 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */; };
88718D011CE5DE2600D88D60 /* UITabBar+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718D001CE5DE2500D88D60 /* UITabBar+RxTests.swift */; };
@ -1415,9 +1416,9 @@
84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextStorageDelegateProxy.swift; sourceTree = "<group>"; };
84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+Rx.swift"; sourceTree = "<group>"; };
84E4D3951C9B011000ADFDC9 /* UISearchController+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchController+RxTests.swift"; sourceTree = "<group>"; };
88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBar+Rx.swift"; sourceTree = "<group>"; };
88718CFD1CE5D80000D88D60 /* UITabBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITabBar+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
88718D001CE5DE2500D88D60 /* UITabBar+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITabBar+RxTests.swift"; sourceTree = "<group>"; };
88D98F2D1CE7549A00D50457 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTabBarDelegateProxy.swift; sourceTree = "<group>"; };
88D98F2D1CE7549A00D50457 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxTabBarDelegateProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
914FCD661CCDB82E0058B304 /* UIPageControl+RxTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIPageControl+RxTest.swift"; sourceTree = "<group>"; };
91BE429B1CBF7EC000F6B062 /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIPageControl+Rx.swift"; sourceTree = "<group>"; };
9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = "<group>"; };
@ -1573,8 +1574,8 @@
C83508DC1C38706D0027C24C /* Control+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Control+RxTests.swift"; sourceTree = "<group>"; };
C83508DD1C38706D0027C24C /* ControlEventTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlEventTests.swift; sourceTree = "<group>"; };
C83508DE1C38706D0027C24C /* ControlPropertyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlPropertyTests.swift; sourceTree = "<group>"; };
C83508DF1C38706D0027C24C /* DelegateProxyTest+Cocoa.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DelegateProxyTest+Cocoa.swift"; sourceTree = "<group>"; };
C83508E01C38706D0027C24C /* DelegateProxyTest+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DelegateProxyTest+UIKit.swift"; sourceTree = "<group>"; };
C83508DF1C38706D0027C24C /* DelegateProxyTest+Cocoa.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DelegateProxyTest+Cocoa.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C83508E01C38706D0027C24C /* DelegateProxyTest+UIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DelegateProxyTest+UIKit.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C83508E11C38706D0027C24C /* DelegateProxyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelegateProxyTest.swift; sourceTree = "<group>"; };
C83508E21C38706D0027C24C /* Driver+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Extensions.swift"; sourceTree = "<group>"; };
C83508E31C38706D0027C24C /* Driver+Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Test.swift"; sourceTree = "<group>"; };
@ -1667,29 +1668,29 @@
C88253F41B8A752B00B02D69 /* ItemEvents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemEvents.swift; sourceTree = "<group>"; };
C88253F71B8A752B00B02D69 /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDataSourceType.swift; sourceTree = "<group>"; };
C88253F81B8A752B00B02D69 /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDataSourceType.swift; sourceTree = "<group>"; };
C88253FC1B8A752B00B02D69 /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDataSourceProxy.swift; sourceTree = "<group>"; };
C88253FC1B8A752B00B02D69 /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxCollectionViewDataSourceProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88253FD1B8A752B00B02D69 /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewDelegateProxy.swift; sourceTree = "<group>"; };
C88253FE1B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxScrollViewDelegateProxy.swift; sourceTree = "<group>"; };
C88253FF1B8A752B00B02D69 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxSearchBarDelegateProxy.swift; sourceTree = "<group>"; };
C88254001B8A752B00B02D69 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDataSourceProxy.swift; sourceTree = "<group>"; };
C88253FE1B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxScrollViewDelegateProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88253FF1B8A752B00B02D69 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxSearchBarDelegateProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88254001B8A752B00B02D69 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = RxTableViewDataSourceProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88254011B8A752B00B02D69 /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewDelegateProxy.swift; sourceTree = "<group>"; };
C88254021B8A752B00B02D69 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextViewDelegateProxy.swift; sourceTree = "<group>"; };
C88254051B8A752B00B02D69 /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIBarButtonItem+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88254061B8A752B00B02D69 /* UIButton+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIButton+Rx.swift"; sourceTree = "<group>"; };
C88254071B8A752B00B02D69 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Rx.swift"; sourceTree = "<group>"; };
C88254071B8A752B00B02D69 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UICollectionView+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88254081B8A752B00B02D69 /* UIControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIControl+Rx.swift"; sourceTree = "<group>"; };
C88254091B8A752B00B02D69 /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Rx.swift"; sourceTree = "<group>"; };
C882540A1B8A752B00B02D69 /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIGestureRecognizer+Rx.swift"; sourceTree = "<group>"; };
C882540B1B8A752B00B02D69 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+Rx.swift"; sourceTree = "<group>"; };
C882540C1B8A752B00B02D69 /* UILabel+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UILabel+Rx.swift"; sourceTree = "<group>"; };
C882540D1B8A752B00B02D69 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIScrollView+Rx.swift"; sourceTree = "<group>"; };
C882540E1B8A752B00B02D69 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISearchBar+Rx.swift"; sourceTree = "<group>"; };
C882540D1B8A752B00B02D69 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIScrollView+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C882540E1B8A752B00B02D69 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UISearchBar+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C882540F1B8A752B00B02D69 /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISegmentedControl+Rx.swift"; sourceTree = "<group>"; };
C88254101B8A752B00B02D69 /* UISlider+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISlider+Rx.swift"; sourceTree = "<group>"; };
C88254111B8A752B00B02D69 /* UISwitch+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UISwitch+Rx.swift"; sourceTree = "<group>"; };
C88254121B8A752B00B02D69 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Rx.swift"; sourceTree = "<group>"; };
C88254121B8A752B00B02D69 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITableView+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88254131B8A752B00B02D69 /* UITextField+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextField+Rx.swift"; sourceTree = "<group>"; };
C88254141B8A752B00B02D69 /* UITextView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextView+Rx.swift"; sourceTree = "<group>"; };
C88254141B8A752B00B02D69 /* UITextView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITextView+Rx.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C88BB8711B07E5ED0064D411 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RunLoopLock.swift; sourceTree = "<group>"; };
C88F76801CE5341700D5A014 /* RxTextInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextInput.swift; sourceTree = "<group>"; };
@ -4376,6 +4377,7 @@
C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */,
C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */,
9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
87379AE01D61C6F50047CA88 /* Reactive.swift in Sources */,
842A5A2E1C357F94003568D5 /* NSTextStorage+Rx.swift in Sources */,
C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */,
C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */,

View File

@ -12,15 +12,15 @@ import RxSwift
#endif
extension CLLocationManager {
extension Reactive where Base: CLLocationManager {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxCLLocationManagerDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxCLLocationManagerDelegateProxy.proxyForObject(base)
}
// MARK: Responding to Location Events
@ -28,8 +28,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didUpdateLocations: Observable<[CLLocation]> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateLocations:)))
public var didUpdateLocations: Observable<[CLLocation]> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateLocations:)))
.map { a in
return try castOrThrow([CLLocation].self, a[1])
}
@ -38,8 +38,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didFailWithError: Observable<NSError> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFailWithError:)))
public var didFailWithError: Observable<NSError> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFailWithError:)))
.map { a in
return try castOrThrow(NSError.self, a[1])
}
@ -49,8 +49,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didFinishDeferredUpdatesWithError: Observable<NSError?> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFinishDeferredUpdatesWithError:)))
public var didFinishDeferredUpdatesWithError: Observable<NSError?> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didFinishDeferredUpdatesWithError:)))
.map { a in
return try castOptionalOrThrow(NSError.self, a[1])
}
@ -64,8 +64,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didPauseLocationUpdates: Observable<Void> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManagerDidPauseLocationUpdates(_:)))
public var didPauseLocationUpdates: Observable<Void> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManagerDidPauseLocationUpdates(_:)))
.map { _ in
return ()
}
@ -74,8 +74,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didResumeLocationUpdates: Observable<Void> {
return rx_delegate.observe( #selector(CLLocationManagerDelegate.locationManagerDidResumeLocationUpdates(_:)))
public var didResumeLocationUpdates: Observable<Void> {
return delegate.observe( #selector(CLLocationManagerDelegate.locationManagerDidResumeLocationUpdates(_:)))
.map { _ in
return ()
}
@ -86,8 +86,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didUpdateHeading: Observable<CLHeading> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateHeading:)))
public var didUpdateHeading: Observable<CLHeading> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didUpdateHeading:)))
.map { a in
return try castOrThrow(CLHeading.self, a[1])
}
@ -98,8 +98,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didEnterRegion: Observable<CLRegion> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didEnterRegion:)))
public var didEnterRegion: Observable<CLRegion> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didEnterRegion:)))
.map { a in
return try castOrThrow(CLRegion.self, a[1])
}
@ -108,8 +108,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didExitRegion: Observable<CLRegion> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didExitRegion:)))
public var didExitRegion: Observable<CLRegion> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didExitRegion:)))
.map { a in
return try castOrThrow(CLRegion.self, a[1])
}
@ -123,8 +123,8 @@ extension CLLocationManager {
Reactive wrapper for `delegate` message.
*/
@available(OSX 10.10, *)
public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didDetermineState:for:)))
public var didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didDetermineState:for:)))
.map { a in
let stateNumber = try castOrThrow(NSNumber.self, a[1])
let state = CLRegionState(rawValue: stateNumber.intValue) ?? CLRegionState.unknown
@ -136,8 +136,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:monitoringDidFailFor:withError:)))
public var monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:monitoringDidFailFor:withError:)))
.map { a in
let region = try castOptionalOrThrow(CLRegion.self, a[1])
let error = try castOrThrow(NSError.self, a[2])
@ -148,8 +148,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didStartMonitoringForRegion: Observable<CLRegion> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didStartMonitoringFor:)))
public var didStartMonitoringForRegion: Observable<CLRegion> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didStartMonitoringFor:)))
.map { a in
return try castOrThrow(CLRegion.self, a[1])
}
@ -164,8 +164,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didRangeBeacons:in:)))
public var didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didRangeBeacons:in:)))
.map { a in
let beacons = try castOrThrow([CLBeacon].self, a[1])
let region = try castOrThrow(CLBeaconRegion.self, a[2])
@ -176,8 +176,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:rangingBeaconsDidFailFor:withError:)))
public var rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:rangingBeaconsDidFailFor:withError:)))
.map { a in
let region = try castOrThrow(CLBeaconRegion.self, a[1])
let error = try castOrThrow(NSError.self, a[2])
@ -191,8 +191,8 @@ extension CLLocationManager {
Reactive wrapper for `delegate` message.
*/
@available(iOS 8.0, *)
public var rx_didVisit: Observable<CLVisit> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didVisit:)))
public var didVisit: Observable<CLVisit> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didVisit:)))
.map { a in
return try castOrThrow(CLVisit.self, a[1])
}
@ -205,8 +205,8 @@ extension CLLocationManager {
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didChangeAuthorizationStatus: Observable<CLAuthorizationStatus> {
return rx_delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didChangeAuthorization:)))
public var didChangeAuthorizationStatus: Observable<CLAuthorizationStatus> {
return delegate.observe(#selector(CLLocationManagerDelegate.locationManager(_:didChangeAuthorization:)))
.map { a in
let number = try castOrThrow(NSNumber.self, a[1])
return CLAuthorizationStatus(rawValue: Int32(number.intValue)) ?? .notDetermined

View File

@ -73,8 +73,8 @@ open class DelegateProxy : _RXDelegateProxy {
....
// reactive property implementation in a real class (`UIScrollView`)
public var rx_property: Observable<CGPoint> {
let proxy = RxScrollViewDelegateProxy.proxyForObject(self)
public var property: Observable<CGPoint> {
let proxy = RxScrollViewDelegateProxy.proxyForObject(base)
return proxy.internalSubject.asObservable()
}

View File

@ -69,8 +69,8 @@ every view has a corresponding delegate virtual factory method.
In case of UITableView / UIScrollView, there is
extension UIScrollView {
public func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
return RxScrollViewDelegateProxy(parentObject: self)
public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxScrollViewDelegateProxy(parentObject: base)
}
....
@ -78,7 +78,7 @@ In case of UITableView / UIScrollView, there is
and override in UITableView
extension UITableView {
public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
....
@ -160,14 +160,14 @@ extension DelegateProxyType {
- returns: Installed instance of delegate proxy.
extension UISearchBar {
extension Reactive where Base: UISearchBar {
public var rx_delegate: DelegateProxy {
return RxSearchBarDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxSearchBarDelegateProxy.proxyForObject(base)
}
public var rx_text: ControlProperty<String> {
let source: Observable<String> = self.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))
public var text: ControlProperty<String> {
let source: Observable<String> = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))
...
}
}

View File

@ -19,12 +19,12 @@ import RxSwift
#endif
#if os(iOS) || os(OSX) || os(tvOS)
extension NSLayoutConstraint {
extension Reactive where Base: NSLayoutConstraint {
/**
Bindable sink for `constant` property.
*/
public var rx_constant: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self) { constraint, constant in
public var constant: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self.base) { constraint, constant in
constraint.constant = constant
}.asObserver()
}
@ -33,8 +33,8 @@ extension NSLayoutConstraint {
Bindable sink for `active` property.
*/
@available(iOS 8, OSX 10.10, *)
public var rx_active: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { constraint, value in
public var active: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { constraint, value in
constraint.isActive = value
}.asObserver()
}

View File

@ -75,7 +75,7 @@ func isWeakProperty(_ properyRuntimeInfo: String) -> Bool {
extension ObservableType where E == AnyObject? {
func finishWithNilWhenDealloc(_ target: NSObject)
-> Observable<AnyObject?> {
let deallocating = target.rx_deallocating
let deallocating = target.rx.deallocating
return deallocating
.map { _ in

View File

@ -11,7 +11,7 @@ import Foundation
import RxSwift
#endif
extension NotificationCenter {
extension Reactive where Base: NotificationCenter {
/**
Transforms notifications posted to notification center to observable sequence of notifications.
@ -20,14 +20,14 @@ extension NotificationCenter {
- returns: Observable sequence of posted notifications.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_notification(_ name: Notification.Name, object: AnyObject? = nil) -> Observable<Notification> {
public func notification(_ name: Notification.Name, object: AnyObject? = nil) -> Observable<Notification> {
return Observable.create { [weak object] observer in
let nsObserver = self.addObserver(forName: name, object: object, queue: nil) { notification in
let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in
observer.on(.next(notification))
}
return Disposables.create {
self.removeObserver(nsObserver)
self.base.removeObserver(nsObserver)
}
}
}

View File

@ -11,34 +11,34 @@ import Foundation
import RxSwift
#endif
extension NSObject {
extension Reactive where Base: NSObject {
/**
Specialization of generic `rx_observe` method.
Specialization of generic `observe` method.
This is a special overload because to observe values of some type (for example `Int`), first values of KVO type
need to be observed (`NSNumber`), and then converted to result type.
For more information take a look at `rx_observe` method.
For more information take a look at `observe` method.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observe<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {
return rx_observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
public func observe<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {
return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
.map(E.init)
}
}
#if !DISABLE_SWIZZLING
// KVO
extension NSObject {
extension Reactive where Base: NSObject {
/**
Specialization of generic `rx_observeWeakly` method.
Specialization of generic `observeWeakly` method.
For more information take a look at `rx_observeWeakly` method.
For more information take a look at `observeWeakly` method.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observeWeakly<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return rx_observeWeakly(E.KVOType.self, keyPath, options: options)
public func observeWeakly<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return observeWeakly(E.KVOType.self, keyPath, options: options)
.map(E.init)
}
}

View File

@ -11,40 +11,40 @@ import Foundation
import RxSwift
#endif
extension NSObject {
extension Reactive where Base: NSObject {
/**
Specialization of generic `rx_observe` method.
Specialization of generic `observe` method.
This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
It is useful for observing bridged ObjC enum values.
For more information take a look at `rx_observe` method.
For more information take a look at `observe` method.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observe<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> where E.RawValue: KVORepresentable {
return rx_observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
public func observe<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> where E.RawValue: KVORepresentable {
return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
.map(E.init)
}
}
#if !DISABLE_SWIZZLING
// rx_observeWeakly + RawRepresentable
extension NSObject {
// observeWeakly + RawRepresentable
extension Reactive where Base: NSObject {
/**
Specialization of generic `rx_observeWeakly` method.
Specialization of generic `observeWeakly` method.
This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
It is useful for observing bridged ObjC enum values.
For more information take a look at `rx_observeWeakly` method.
For more information take a look at `observeWeakly` method.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observeWeakly<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> where E.RawValue: KVORepresentable {
return rx_observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)
public func observeWeakly<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> where E.RawValue: KVORepresentable {
return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)
.map(E.init)
}
}

View File

@ -38,20 +38,20 @@ Both approaches can fail in certain scenarios:
Second approach is chosen. It can fail in case there are multiple libraries dynamically trying
to replace dealloc method. In case that isn't the case, it should be ok.
*/
extension NSObject {
extension Reactive where Base: NSObject {
/**
Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set.
`rx_observe` is just a simple and performant wrapper around KVO mechanism.
`observe` is just a simple and performant wrapper around KVO mechanism.
* it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`)
* it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)
* the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc.
If support for weak properties is needed or observing arbitrary or unknown relationships in the
ownership tree, `rx_observeWeakly` is the preferred option.
ownership tree, `observeWeakly` is the preferred option.
- parameter keyPath: Key path of property names to observe.
- parameter options: KVO mechanism notification options.
@ -59,18 +59,18 @@ extension NSObject {
- returns: Observable sequence of objects on `keyPath`.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observe<E>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {
return KVOObservable(object: self, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()
public func observe<E>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {
return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()
}
}
#if !DISABLE_SWIZZLING
// KVO
extension NSObject {
extension Reactive where Base: NSObject {
/**
Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`.
It can be used in all cases where `rx_observe` can be used and additionally
It can be used in all cases where `observe` can be used and additionally
* because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown
* it can be used to observe `weak` properties
@ -82,8 +82,8 @@ extension NSObject {
- returns: Observable sequence of objects on `keyPath`.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observeWeakly<E>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return observeWeaklyKeyPathFor(self, keyPath: keyPath, options: options)
public func observeWeakly<E>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options)
.map { n in
return n as? E
}
@ -92,7 +92,7 @@ extension NSObject {
#endif
// Dealloc
extension NSObject {
extension Reactive where Base: NSObject {
/**
Observable sequence of object deallocated events.
@ -101,15 +101,15 @@ extension NSObject {
- returns: Observable sequence of object deallocated events.
*/
public var rx_deallocated: Observable<Void> {
return rx_synchronized {
if let deallocObservable = objc_getAssociatedObject(self, &deallocatedSubjectContext) as? DeallocObservable {
public var deallocated: Observable<Void> {
return synchronized {
if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable {
return deallocObservable._subject
}
let deallocObservable = DeallocObservable()
objc_setAssociatedObject(self, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return deallocObservable._subject
}
}
@ -125,24 +125,24 @@ extension NSObject {
- returns: Observable sequence of object deallocating events.
*/
public func rx_sentMessage(_ selector: Selector) -> Observable<[Any]> {
return rx_synchronized {
public func sentMessage(_ selector: Selector) -> Observable<[AnyObject]> {
return synchronized {
// in case of dealloc selector replay subject behavior needs to be used
if selector == deallocSelector {
return rx_deallocating.map { _ in [] }
return deallocating.map { _ in [] }
}
let rxSelector = RX_selector(selector)
let selectorReference = RX_reference_from_selector(rxSelector)
let subject: MessageSentObservable
if let existingSubject = objc_getAssociatedObject(self, selectorReference) as? MessageSentObservable {
if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? MessageSentObservable {
subject = existingSubject
}
else {
subject = MessageSentObservable()
objc_setAssociatedObject(
self,
base,
selectorReference,
subject,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
@ -154,8 +154,8 @@ extension NSObject {
}
var error: NSError?
guard let targetImplementation = RX_ensure_observing(self, selector, &error) else {
return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.unknown)
guard let targetImplementation = RX_ensure_observing(base, selector, &error) else {
return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
}
subject.targetImplementation = targetImplementation
@ -173,17 +173,17 @@ extension NSObject {
- returns: Observable sequence of object deallocating events.
*/
public var rx_deallocating: Observable<()> {
return rx_synchronized {
public var deallocating: Observable<()> {
return synchronized {
let subject: DeallocatingObservable
if let existingSubject = objc_getAssociatedObject(self, rxDeallocatingSelectorReference) as? DeallocatingObservable {
if let existingSubject = objc_getAssociatedObject(base, rxDeallocatingSelectorReference) as? DeallocatingObservable {
subject = existingSubject
}
else {
subject = DeallocatingObservable()
objc_setAssociatedObject(
self,
base,
rxDeallocatingSelectorReference,
subject,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
@ -195,9 +195,9 @@ extension NSObject {
}
var error: NSError?
let targetImplementation = RX_ensure_observing(self, deallocSelector, &error)
let targetImplementation = RX_ensure_observing(base, deallocSelector, &error)
if targetImplementation == nil {
return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.unknown)
return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
}
subject.targetImplementation = targetImplementation!
@ -211,28 +211,28 @@ let deallocSelector = NSSelectorFromString("dealloc")
let rxDeallocatingSelector = RX_selector(deallocSelector)
let rxDeallocatingSelectorReference = RX_reference_from_selector(rxDeallocatingSelector)
extension NSObject {
func rx_synchronized<T>(_ action: () -> T) -> T {
objc_sync_enter(self)
extension Reactive where Base: NSObject {
func synchronized<T>( _ action: () -> T) -> T {
objc_sync_enter(self.base)
let result = action()
objc_sync_exit(self)
objc_sync_exit(self.base)
return result
}
}
extension NSObject {
extension Reactive where Base: NSObject {
/**
Helper to make sure that `Observable` returned from `createCachedObservable` is only created once.
This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`.
*/
func rx_lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
if let value = objc_getAssociatedObject(self, key) {
func lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
if let value = objc_getAssociatedObject(base, key) {
return value as! T
}
let observable = createCachedObservable()
objc_setAssociatedObject(self, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return observable
}

View File

@ -105,7 +105,7 @@ func convertResponseToString(_ data: Data!, _ response: URLResponse!, _ error: N
return "<Unhandled response from server>"
}
extension URLSession {
extension Reactive where Base: URLSession {
/**
Observable sequence of responses for URL request.
@ -119,7 +119,7 @@ extension URLSession {
- returns: Observable sequence of URL responses.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> {
public func response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> {
return Observable.create { observer in
// smart compiler should be able to optimize this out
@ -129,7 +129,7 @@ extension URLSession {
d = Date()
}
let task = self.dataTask(with: request) { (data, response, error) in
let task = self.base.dataTask(with: request) { (data, response, error) in
if Logging.URLRequests(request) {
let interval = Date().timeIntervalSince(d ?? Date())
@ -175,8 +175,8 @@ extension URLSession {
- returns: Observable sequence of response data.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_data(_ request: URLRequest) -> Observable<Data> {
return rx_response(request).map { (data, response) -> Data in
public func data(_ request: URLRequest) -> Observable<Data> {
return response(request).map { (data, response) -> Data in
if 200 ..< 300 ~= response.statusCode {
return data
}
@ -204,8 +204,8 @@ extension URLSession {
- returns: Observable sequence of response JSON.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_JSON(_ request: URLRequest) -> Observable<AnyObject> {
return rx_data(request).map { (data) -> AnyObject in
public func JSON(_ request: URLRequest) -> Observable<AnyObject> {
return data(request).map { (data) -> AnyObject in
do {
return try JSONSerialization.jsonObject(with: data, options: []) as AnyObject
} catch let error {
@ -232,7 +232,7 @@ extension URLSession {
- returns: Observable sequence of response JSON.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_JSON(_ URL: Foundation.URL) -> Observable<AnyObject> {
return rx_JSON(URLRequest(url: URL))
public func JSON(_ URL: Foundation.URL) -> Observable<AnyObject> {
return JSON(URLRequest(url: URL))
}
}

View File

@ -7,27 +7,41 @@
//
/**
We can use `Reactive` protocol as customization point for constrained protocol extensions.
Use `Reactive` proxy as customization point for constrained protocol extensions.
General pattern would be:
General pattern would be:
// 1. Extend Reactive protocol with constrain on Self
// Read as: Reactive Extension where Self is a SomeType
extension Reactive where Self: SomeType {
// 2. Put any specific reactive extension for SomeType here
}
// 1. Conform SomeType to Reactive protocol
extension SomeType: Reactive {}
With this approach we can have more specialized methods and properties using
`Self` and not just specialized on common base type.
// 2. Extend Reactive protocol with constrain on Self
// Read as: Reactive Extension where Self is a SomeType
extension Reactive where Self: SomeType {
// 3. Put any specific reactive extension for SomeType here
*/
public struct Reactive<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
With this approach we can have more specialized methods and properties using
`Self` and not just specialized on common base type.
See UIGestureRecognizer+Rx.swift as an example
*/
public protocol Reactive {
}
public protocol ReactiveCompatible {
associatedtype CompatibleType
var rx: Reactive<CompatibleType> { get }
}
public extension ReactiveCompatible {
public var rx: Reactive<Self> {
return Reactive(self)
}
}
/**
Extend NSObject with `rx` proxy.
*/
extension NSObject: ReactiveCompatible { }

View File

@ -80,9 +80,9 @@ public enum RxCocoaObjCRuntimeError
If the object is reporting a different class then it's real class, that means that there is probably
already some interception mechanism in place or something weird is happening.
The most common case when this would happen is when using a combination of KVO (`rx_observe`) and `rx_sentMessage`.
The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`.
This error is easily resolved by just using `rx_sentMessage` observing before `rx_observe`.
This error is easily resolved by just using `sentMessage` observing before `observe`.
The reason why the other way around could create issues is because KVO will unregister it's interceptor
class and restore original class. Unfortunately that will happen no matter was there another interceptor
@ -90,7 +90,7 @@ public enum RxCocoaObjCRuntimeError
Failure scenario:
* KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)
* `rx_sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
* `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
* then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO)
The reason why changing order of observing works is because any interception method on unregistration

View File

@ -21,6 +21,19 @@ import Foundation
*/
var rx_text: ControlProperty<String> { get }
}
extension UITextField : RxTextInput {
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
extension UITextView : RxTextInput {
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
#endif
#if os(OSX)
@ -36,4 +49,13 @@ import Foundation
*/
var rx_text: ControlProperty<String> { get }
}
#endif
extension NSTextField : RxTextInput {
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
#endif

View File

@ -613,11 +613,11 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
}
// For `dealloc` message, original implementation will be swizzled.
// This is a special case because observing `dealloc` message is performed when `rx_observeWeakly` is used.
// This is a special case because observing `dealloc` message is performed when `observeWeakly` is used.
//
// Some toll free bridged classes don't handle `object_setClass` well and cause crashes.
//
// To make `rx_deallocating` as robust as possible, original implementation will be replaced.
// To make `deallocating` as robust as possible, original implementation will be replaced.
if (selector == deallocSelector) {
Class __nonnull deallocSwizzingTarget = [target class];
IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];
@ -720,9 +720,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
If the object is reporting a different class then what it's real class, that means that there is probably
already some interception mechanism in place or something weird is happening.
Most common case when this would happen is when using KVO (`rx_observe`) and `rx_sentMessage`.
Most common case when this would happen is when using KVO (`observe`) and `sentMessage`.
This error is easily resolved by just using `rx_sentMessage` observing before `rx_observe`.
This error is easily resolved by just using `sentMessage` observing before `observe`.
The reason why other way around could create issues is because KVO will unregister it's interceptor
class and restore original class. Unfortunately that will happen no matter was there another interceptor
@ -730,7 +730,7 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
Failure scenario:
* KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)
* `rx_sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
* `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)
* then unobserving with KVO will restore class to be `OriginalClass` -> failure point
The reason why changing order of observing works is because any interception method should return
@ -1017,4 +1017,4 @@ NSInteger RX_number_of_swizzled_methods() {
#endif
#endif
#endif

View File

@ -12,21 +12,21 @@ import RxSwift
#endif
import Cocoa
extension NSButton {
extension Reactive where Base: NSButton {
/**
Reactive wrapper for control event.
*/
public var rx_tap: ControlEvent<Void> {
return rx_controlEvent
public var tap: ControlEvent<Void> {
return controlEvent
}
/**
Reactive wrapper for `state` property`.
*/
public var rx_state: ControlProperty<Int> {
return NSButton.rx_value(
self,
public var state: ControlProperty<Int> {
return Reactive<NSButton>.value(
base,
getter: { control in
return control.state
}, setter: { control, state in
@ -34,4 +34,4 @@ extension NSButton {
}
)
}
}
}

View File

@ -15,19 +15,19 @@ import RxSwift
var rx_value_key: UInt8 = 0
var rx_control_events_key: UInt8 = 0
extension NSControl {
extension Reactive where Base: NSControl {
/**
Reactive wrapper for control event.
*/
public var rx_controlEvent: ControlEvent<Void> {
public var controlEvent: ControlEvent<Void> {
MainScheduler.ensureExecutingOnScheduler()
let source = rx_lazyInstanceObservable(&rx_control_events_key) { () -> Observable<Void> in
Observable.create { [weak self] observer in
let source = lazyInstanceObservable(&rx_control_events_key) { () -> Observable<Void> in
Observable.create { [weak control = self.base] observer in
MainScheduler.ensureExecutingOnScheduler()
guard let control = self else {
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
@ -37,7 +37,7 @@ extension NSControl {
}
return observer
}.takeUntil(self.rx_deallocated)
}.takeUntil(self.deallocated)
}
return ControlEvent(events: source)
@ -47,10 +47,10 @@ extension NSControl {
You might be wondering why the ugly `as!` casts etc, well, for some reason if
Swift compiler knows C is UIControl type and optimizations are turned on, it will crash.
*/
static func rx_value<C: AnyObject, T: Equatable>(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty<T> {
static func value<C: AnyObject, T: Equatable>(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty<T> {
MainScheduler.ensureExecutingOnScheduler()
let source = (control as! NSObject).rx_lazyInstanceObservable(&rx_value_key) { () -> Observable<T> in
let source = (control as! NSObject).rx.lazyInstanceObservable(&rx_value_key) { () -> Observable<T> in
return Observable.create { [weak weakControl = control] (observer: AnyObserver<T>) in
guard let control = weakControl else {
observer.on(.completed)
@ -68,7 +68,7 @@ extension NSControl {
return observer
}
.distinctUntilChanged()
.takeUntil((control as! NSObject).rx_deallocated)
.takeUntil((control as! NSObject).rx.deallocated)
}
let bindingObserver = UIBindingObserver(UIElement: control, binding: setter)
@ -79,8 +79,8 @@ extension NSControl {
/**
Bindable sink for `enabled` property.
*/
public var rx_enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { (owner, value) in
public var enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { (owner, value) in
owner.isEnabled = value
}.asObserver()
}

View File

@ -12,13 +12,13 @@ import RxSwift
#endif
import Cocoa
extension NSImageView {
extension Reactive where Base: NSImageView {
/**
Bindable sink for `image` property.
*/
public var rx_image: AnyObserver<NSImage?> {
return self.rx_image(transitionType: nil)
public var image: AnyObserver<NSImage?> {
return image(transitionType: nil)
}
/**
@ -26,9 +26,9 @@ extension NSImageView {
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/
@available(*, deprecated, renamed: "rx_image(transitionType:)")
public func rx_imageAnimated(_ transitionType: String?) -> AnyObserver<NSImage?> {
return UIBindingObserver(UIElement: self) { control, value in
@available(*, deprecated, renamed: "image(transitionType:)")
public func imageAnimated(_ transitionType: String?) -> AnyObserver<NSImage?> {
return UIBindingObserver(UIElement: self.base) { control, value in
if let transitionType = transitionType {
if value != nil {
let transition = CATransition()
@ -50,8 +50,8 @@ extension NSImageView {
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/
public func rx_image(transitionType: String? = nil) -> AnyObserver<NSImage?> {
return UIBindingObserver(UIElement: self) { control, value in
public func image(transitionType: String? = nil) -> AnyObserver<NSImage?> {
return UIBindingObserver(UIElement: self.base) { control, value in
if let transitionType = transitionType {
if value != nil {
let transition = CATransition()

View File

@ -12,14 +12,14 @@ import RxSwift
#endif
import Cocoa
extension NSSlider {
extension Reactive where Base: NSSlider {
/**
Reactive wrapper for `value` property.
*/
public var rx_value: ControlProperty<Double> {
return NSControl.rx_value(
self,
public var value: ControlProperty<Double> {
return Reactive<NSControl>.value(
base,
getter: { control in
return control.doubleValue
},
@ -29,4 +29,4 @@ extension NSSlider {
)
}
}
}

View File

@ -55,7 +55,7 @@ public class RxTextFieldDelegateProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let control = (object as! NSTextField)
return castOrFatalError(control.rx_createDelegateProxy())
return castOrFatalError(control.createRxDelegateProxy())
}
/**
@ -76,37 +76,40 @@ public class RxTextFieldDelegateProxy
}
extension NSTextField : RxTextInput {
extension NSTextField {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public func rx_createDelegateProxy() -> RxTextFieldDelegateProxy {
public func createRxDelegateProxy() -> RxTextFieldDelegateProxy {
return RxTextFieldDelegateProxy(parentObject: self)
}
}
extension Reactive where Base: NSTextField {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxTextFieldDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxTextFieldDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `text` property.
*/
public var rx_text: ControlProperty<String> {
let delegate = RxTextFieldDelegateProxy.proxyForObject(self)
public var text: ControlProperty<String> {
let delegate = RxTextFieldDelegateProxy.proxyForObject(base)
let source = Observable.deferred { [weak self] in
delegate.textSubject.startWith(self?.stringValue ?? "")
}.takeUntil(rx_deallocated)
let source = Observable.deferred { [weak textField = self.base] in
delegate.textSubject.startWith(textField?.stringValue ?? "")
}.takeUntil(deallocated)
let observer = UIBindingObserver(UIElement: self) { control, value in
let observer = UIBindingObserver(UIElement: base) { control, value in
control.stringValue = value
}

View File

@ -12,12 +12,12 @@ import Cocoa
import RxSwift
#endif
extension NSView {
extension Reactive where Base: NSView {
/**
Bindable sink for `hidden` property.
*/
public var rx_hidden: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { view, value in
public var hidden: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { view, value in
view.isHidden = value
}.asObserver()
}
@ -25,8 +25,8 @@ extension NSView {
/**
Bindable sink for `alphaValue` property.
*/
public var rx_alpha: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self) { view, value in
public var alpha: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self.base) { view, value in
view.alphaValue = value
}.asObserver()
}

View File

@ -14,22 +14,22 @@ import Foundation
#endif
import UIKit
extension NSTextStorage {
extension Reactive where Base: NSTextStorage {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate:DelegateProxy {
return RxTextStorageDelegateProxy.proxyForObject(self)
public var delegate:DelegateProxy {
return RxTextStorageDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> {
return rx_delegate
public var didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> {
return delegate
.observe(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:)))
.map { a in
let editedMask = NSTextStorageEditActions(rawValue: try castOrThrow(UInt.self, a[1]) )

View File

@ -81,7 +81,7 @@ public class RxCollectionViewDataSourceProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let collectionView = (object as! UICollectionView)
return castOrFatalError(collectionView.rx_createDataSourceProxy())
return castOrFatalError(collectionView.createRxDataSourceProxy())
}
/**

View File

@ -72,7 +72,7 @@ public class RxScrollViewDelegateProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let scrollView = (object as! UIScrollView)
return castOrFatalError(scrollView.rx_createDelegateProxy())
return castOrFatalError(scrollView.createRxDelegateProxy())
}
/**

View File

@ -47,7 +47,7 @@ public class RxSearchBarDelegateProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let searchBar = (object as! UISearchBar)
return castOrFatalError(searchBar.rx_createDelegateProxy())
return castOrFatalError(searchBar.createRxDelegateProxy())
}
#endif

View File

@ -44,7 +44,7 @@ public class RxTabBarDelegateProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let tabBar = (object as! UITabBar)
return castOrFatalError(tabBar.rx_createDelegateProxy())
return castOrFatalError(tabBar.createRxDelegateProxy())
}
}

View File

@ -78,7 +78,7 @@ public class RxTableViewDataSourceProxy
public override class func createProxyForObject(_ object: AnyObject) -> AnyObject {
let tableView = (object as! UITableView)
return castOrFatalError(tableView.rx_createDataSourceProxy())
return castOrFatalError(tableView.createRxDataSourceProxy())
}
/**

View File

@ -13,17 +13,17 @@ import UIKit
import RxSwift
#endif
extension UIActivityIndicatorView {
extension Reactive where Base: UIActivityIndicatorView {
/**
Bindable sink for `startAnimating()`, `stopAnimating()` methods.
*/
public var rx_animating: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { activityIndicator, active in
public var animating: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { activityIndicator, active in
if active {
self.startAnimating()
activityIndicator.startAnimating()
} else {
self.stopAnimating()
activityIndicator.stopAnimating()
}
}.asObserver()
}

View File

@ -17,13 +17,13 @@ import UIKit
import RxSwift
#endif
extension UIAlertAction {
extension Reactive where Base: UIAlertAction {
/**
Bindable sink for `enabled` property.
*/
public var rx_enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { alertAction, value in
public var enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { alertAction, value in
alertAction.isEnabled = value
}.asObserver()
}

View File

@ -15,13 +15,13 @@ import Foundation
import RxSwift
#endif
extension UIApplication {
extension Reactive where Base: UIApplication {
/**
Bindable sink for `networkActivityIndicatorVisible`.
*/
public var rx_networkActivityIndicatorVisible: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { application, active in
public var networkActivityIndicatorVisible: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { application, active in
application.isNetworkActivityIndicatorVisible = active
}.asObserver()
}

View File

@ -15,13 +15,13 @@ import RxSwift
var rx_tap_key: UInt8 = 0
extension UIBarButtonItem {
extension Reactive where Base: UIBarButtonItem {
/**
Bindable sink for `enabled` property.
*/
public var rx_enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { UIElement, value in
public var enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { UIElement, value in
UIElement.isEnabled = value
}.asObserver()
}
@ -29,10 +29,10 @@ extension UIBarButtonItem {
/**
Reactive wrapper for target action pattern on `self`.
*/
public var rx_tap: ControlEvent<Void> {
let source = rx_lazyInstanceObservable(&rx_tap_key) { () -> Observable<Void> in
Observable.create { [weak self] observer in
guard let control = self else {
public var tap: ControlEvent<Void> {
let source = lazyInstanceObservable(&rx_tap_key) { () -> Observable<Void> in
Observable.create { [weak control = self.base] observer in
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
@ -41,7 +41,7 @@ extension UIBarButtonItem {
}
return target
}
.takeUntil(self.rx_deallocated)
.takeUntil(self.deallocated)
.share()
}

View File

@ -14,13 +14,13 @@ import RxSwift
#endif
import UIKit
extension UIButton {
extension Reactive where Base: UIButton {
/**
Reactive wrapper for `TouchUpInside` control event.
*/
public var rx_tap: ControlEvent<Void> {
return rx_controlEvent(.touchUpInside)
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
}
@ -34,13 +34,13 @@ import Foundation
#endif
import UIKit
extension UIButton {
extension Reactive where Base: UIButton {
/**
Reactive wrapper for `PrimaryActionTriggered` control event.
*/
public var rx_primaryAction: ControlEvent<Void> {
return rx_controlEvent(.primaryActionTriggered)
public var primaryAction: ControlEvent<Void> {
return controlEvent(.primaryActionTriggered)
}
}
@ -55,12 +55,12 @@ extension UIButton {
#endif
import UIKit
extension UIButton {
extension Reactive where Base: UIButton {
/**
Reactive wrapper for `setTitle(_:controlState:)`
*/
public func rx_title(controlState: UIControlState = []) -> AnyObserver<String?> {
return UIBindingObserver<UIButton, String?>(UIElement: self) { (button, title) -> () in
public func title(controlState: UIControlState = []) -> AnyObserver<String?> {
return UIBindingObserver<UIButton, String?>(UIElement: self.base) { (button, title) -> () in
button.setTitle(title, for: controlState)
}.asObserver()
}

View File

@ -16,7 +16,7 @@ import UIKit
// Items
extension UICollectionView {
extension Reactive where Base: UICollectionView {
/**
Binds sequences of elements to collection view items.
@ -34,7 +34,7 @@ extension UICollectionView {
])
items
.bindTo(collectionView.rx_itemsWithCellFactory) { (collectionView, row, element) in
.bindTo(collectionView.rx.itemsWithCellFactory) { (collectionView, row, element) in
let indexPath = IndexPath(forItem: row, inSection: 0)
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell
cell.value?.text = "\(element) @ \(row)"
@ -42,14 +42,14 @@ extension UICollectionView {
}
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(source:cellFactory:)")
@available(*, deprecated, renamed: "items(source:cellFactory:)")
public func rx_itemsWithCellFactory<S: Sequence, O: ObservableType>
(_ source: O)
-> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell)
-> Disposable where O.E == S {
return { cellFactory in
let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
return self.rx_itemsWithDataSource(dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
@ -70,7 +70,7 @@ extension UICollectionView {
])
items
.bindTo(collectionView.rx_items) { (collectionView, row, element) in
.bindTo(collectionView.rx.items) { (collectionView, row, element) in
let indexPath = IndexPath(forItem: row, inSection: 0)
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell
cell.value?.text = "\(element) @ \(row)"
@ -78,13 +78,13 @@ extension UICollectionView {
}
.addDisposableTo(disposeBag)
*/
public func rx_items<S: Sequence, O: ObservableType>
public func items<S: Sequence, O: ObservableType>
(source: O)
-> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell)
-> Disposable where O.E == S {
return { cellFactory in
let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
@ -107,12 +107,12 @@ extension UICollectionView {
])
items
.bindTo(collectionView.rx_itemsWithCellIdentifier("Cell", cellType: NumberCell.self)) { (row, element, cell) in
.bindTo(collectionView.rx.itemsWithCellIdentifier("Cell", cellType: NumberCell.self)) { (row, element, cell) in
cell.value?.text = "\(element) @ \(row)"
}
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(cellIdentifier:cellType:source:configureCell:)")
@available(*, deprecated, renamed: "items(cellIdentifier:cellType:source:configureCell:)")
public func rx_itemsWithCellIdentifier<S: Sequence, Cell: UICollectionViewCell, O : ObservableType>
(_ cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (_ source: O)
@ -127,7 +127,7 @@ extension UICollectionView {
return cell
}
return self.rx_itemsWithDataSource(dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}
@ -150,12 +150,12 @@ extension UICollectionView {
])
items
.bindTo(collectionView.rx_items(cellIdentifier: "Cell", cellType: NumberCell.self)) { (row, element, cell) in
.bindTo(collectionView.rx.items(cellIdentifier: "Cell", cellType: NumberCell.self)) { (row, element, cell) in
cell.value?.text = "\(element) @ \(row)"
}
.addDisposableTo(disposeBag)
*/
public func rx_items<S: Sequence, Cell: UICollectionViewCell, O : ObservableType>
public func items<S: Sequence, Cell: UICollectionViewCell, O : ObservableType>
(cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (_ source: O)
-> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
@ -169,7 +169,7 @@ extension UICollectionView {
return cell
}
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}
@ -211,11 +211,11 @@ extension UICollectionView {
}
items
.bindTo(collectionView.rx_itemsWithDataSource(dataSource))
.bindTo(collectionView.rx.itemsWithDataSource(dataSource))
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(dataSource:source:)")
public func rx_itemsWithDataSource<
@available(*, deprecated, renamed: "items(dataSource:source:)")
public func itemsWithDataSource<
DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
O: ObservableType>
(_ dataSource: DataSource)
@ -223,9 +223,8 @@ extension UICollectionView {
-> Disposable where DataSource.Element == O.E
{
return { source in
return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxCollectionViewDataSourceProxy, event) -> Void in
guard let collectionView = self else {
return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in
guard let collectionView = collectionView else {
return
}
dataSource.collectionView(collectionView, observedEvent: event)
@ -269,10 +268,10 @@ extension UICollectionView {
}
items
.bindTo(collectionView.rx_items(dataSource: dataSource))
.bindTo(collectionView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
*/
public func rx_items<
public func items<
DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
O: ObservableType>
(dataSource: DataSource)
@ -286,10 +285,10 @@ extension UICollectionView {
// call `self.rx_delegate`. If that happens, it might cause weird side effects since
// setting data source will set delegate, and UITableView might get into a weird state.
// Therefore it's better to set delegate proxy first, just to be sure.
_ = self.rx_delegate
_ = self.delegate
// Strong reference is needed because data source is in use until result subscription is disposed
return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxCollectionViewDataSourceProxy, event) -> Void in
guard let collectionView = self else {
return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in
guard let collectionView = collectionView else {
return
}
dataSource.collectionView(collectionView, observedEvent: event)
@ -301,34 +300,38 @@ extension UICollectionView {
extension UICollectionView {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxCollectionViewDelegateProxy(parentObject: self)
}
/**
Factory method that enables subclasses to implement their own `rx_dataSource`.
- returns: Instance of delegate proxy that wraps `dataSource`.
*/
public func rx_createDataSourceProxy() -> RxCollectionViewDataSourceProxy {
Factory method that enables subclasses to implement their own `rx.dataSource`.
- returns: Instance of delegate proxy that wraps `dataSource`.
*/
public func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy {
return RxCollectionViewDataSourceProxy(parentObject: self)
}
}
extension Reactive where Base: UICollectionView {
/**
Reactive wrapper for `dataSource`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_dataSource: DelegateProxy {
return RxCollectionViewDataSourceProxy.proxyForObject(self)
public var dataSource: DelegateProxy {
return RxCollectionViewDataSourceProxy.proxyForObject(base)
}
/**
Installs data source as forwarding delegate on `rx_dataSource`.
Installs data source as forwarding delegate on `rx.dataSource`.
Data source won't be retained.
It enables using normal delegate mechanism with reactive delegate mechanism.
@ -336,16 +339,16 @@ extension UICollectionView {
- parameter dataSource: Data source object.
- returns: Disposable object that can be used to unbind the data source.
*/
public func rx_setDataSource(_ dataSource: UICollectionViewDataSource)
public func setDataSource(_ dataSource: UICollectionViewDataSource)
-> Disposable {
return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self)
return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)
}
/**
Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
*/
public var rx_itemSelected: ControlEvent<IndexPath> {
let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))
public var itemSelected: ControlEvent<IndexPath> {
let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))
.map { a in
return a[1] as! IndexPath
}
@ -356,8 +359,8 @@ extension UICollectionView {
/**
Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
*/
public var rx_itemDeselected: ControlEvent<IndexPath> {
let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))
public var itemDeselected: ControlEvent<IndexPath> {
let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))
.map { a in
return a[1] as! IndexPath
}
@ -368,21 +371,21 @@ extension UICollectionView {
/**
Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
or any other data source conforming to `SectionedViewDataSourceType` protocol.
```
collectionView.rx_modelSelected(MyModel.self)
collectionView.rx.modelSelected(MyModel.self)
.map { ...
```
*/
public func rx_modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemSelected.flatMap { [weak self] indexPath -> Observable<T> in
guard let view = self else {
public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = itemSelected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in
guard let view = view else {
return Observable.empty()
}
return Observable.just(try view.rx_modelAtIndexPath(indexPath))
return Observable.just(try view.rx.modelAtIndexPath(indexPath))
}
return ControlEvent(events: source)
@ -391,21 +394,21 @@ extension UICollectionView {
/**
Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`.
It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
or any other data source conforming to `SectionedViewDataSourceType` protocol.
```
collectionView.rx_modelDeselected(MyModel.self)
collectionView.rx.modelDeselected(MyModel.self)
.map { ...
```
*/
public func rx_modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable<T> in
guard let view = self else {
public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = itemDeselected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in
guard let view = view else {
return Observable.empty()
}
return Observable.just(try view.rx_modelAtIndexPath(indexPath))
return Observable.just(try view.rx.modelAtIndexPath(indexPath))
}
return ControlEvent(events: source)
@ -414,8 +417,8 @@ extension UICollectionView {
/**
Syncronous helper method for retrieving a model at indexPath through a reactive data source
*/
public func rx_modelAtIndexPath<T>(_ indexPath: IndexPath) throws -> T {
let dataSource: SectionedViewDataSourceType = castOrFatalError(self.rx_dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx_itemsWith*` methods was used.")
public func modelAtIndexPath<T>(_ indexPath: IndexPath) throws -> T {
let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.itemsWith*` methods was used.")
let element = try dataSource.modelAtIndexPath(indexPath)
@ -426,14 +429,14 @@ extension UICollectionView {
#if os(tvOS)
extension UICollectionView {
extension Reactive where Base: UICollectionView {
/**
Reactive wrapper for `delegate` message `collectionView:didUpdateFocusInContext:withAnimationCoordinator:`.
*/
public var rx_didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
let source = rx_delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))
let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))
.map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in
let context = a[1] as! UIFocusUpdateContext
let animationCoordinator = a[2] as! UIFocusAnimationCoordinator

View File

@ -14,13 +14,13 @@ import RxSwift
#endif
import UIKit
extension UIControl {
extension Reactive where Base: UIControl {
/**
Bindable sink for `enabled` property.
*/
public var rx_enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { control, value in
public var enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { control, value in
control.isEnabled = value
}.asObserver()
}
@ -28,8 +28,8 @@ extension UIControl {
/**
Bindable sink for `selected` property.
*/
public var rx_selected: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { control, selected in
public var selected: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { control, selected in
control.isSelected = selected
}.asObserver()
}
@ -39,11 +39,11 @@ extension UIControl {
- parameter controlEvents: Filter for observed event types.
*/
public func rx_controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent<Void> {
let source: Observable<Void> = Observable.create { [weak self] observer in
public func controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent<Void> {
let source: Observable<Void> = Observable.create { [weak control = self.base] observer in
MainScheduler.ensureExecutingOnScheduler()
guard let control = self else {
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
@ -54,8 +54,8 @@ extension UIControl {
}
return Disposables.create(with: controlTarget.dispose)
}.takeUntil(rx_deallocated)
}.takeUntil(deallocated)
return ControlEvent(events: source)
}
@ -63,7 +63,7 @@ extension UIControl {
You might be wondering why the ugly `as!` casts etc, well, for some reason if
Swift compiler knows C is UIControl type and optimizations are turned on, it will crash.
*/
static func rx_value<C: AnyObject, T: Equatable>(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty<T> {
static func value<C: AnyObject, T: Equatable>(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty<T> {
let source: Observable<T> = Observable.create { [weak weakControl = control] observer in
guard let control = weakControl else {
observer.on(.completed)
@ -80,7 +80,7 @@ extension UIControl {
return Disposables.create(with: controlTarget.dispose)
}
.takeUntil((control as! NSObject).rx_deallocated)
.takeUntil((control as! NSObject).rx.deallocated)
let bindingObserver = UIBindingObserver(UIElement: control, binding: setter)

View File

@ -14,14 +14,14 @@ import RxSwift
#endif
import UIKit
extension UIDatePicker {
extension Reactive where Base: UIDatePicker {
/**
Reactive wrapper for `date` property.
*/
public var rx_date: ControlProperty<Date> {
return UIControl.rx_value(
self,
public var date: ControlProperty<Date> {
return Reactive<UIControl>.value(
self.base,
getter: { datePicker in
datePicker.date
}, setter: { datePicker, value in

View File

@ -51,18 +51,16 @@ class GestureTarget<Recognizer: UIGestureRecognizer>: RxTarget {
}
}
extension UIGestureRecognizer: Reactive { }
extension Reactive where Self: UIGestureRecognizer {
extension Reactive where Base: UIGestureRecognizer {
/**
Reactive wrapper for gesture recognizer events.
*/
public var rx_event: ControlEvent<Self> {
let source: Observable<Self> = Observable.create { [weak self] observer in
public var event: ControlEvent<Base> {
let source: Observable<Base> = Observable.create { [weak control = self.base] observer in
MainScheduler.ensureExecutingOnScheduler()
guard let control = self else {
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
@ -73,7 +71,7 @@ extension Reactive where Self: UIGestureRecognizer {
}
return observer
}.takeUntil(rx_deallocated)
}.takeUntil(deallocated)
return ControlEvent(events: source)
}

View File

@ -16,22 +16,22 @@ import Foundation
#endif
import UIKit
extension UIImagePickerController {
extension Reactive where Base: UIImagePickerController {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxImagePickerDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxImagePickerDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {
return rx_delegate
public var didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {
return delegate
.observe(#selector(UIImagePickerControllerDelegate.imagePickerController(_:didFinishPickingMediaWithInfo:)))
.map({ (a) in
return try castOrThrow(Dictionary<String, AnyObject>.self, a[1])
@ -41,8 +41,8 @@ import Foundation
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didCancel: Observable<()> {
return rx_delegate
public var didCancel: Observable<()> {
return delegate
.observe(#selector(UIImagePickerControllerDelegate.imagePickerControllerDidCancel(_:)))
.map {_ in () }
}

View File

@ -14,13 +14,13 @@ import RxSwift
#endif
import UIKit
extension UIImageView {
extension Reactive where Base: UIImageView {
/**
Bindable sink for `image` property.
*/
public var rx_image: AnyObserver<UIImage?> {
return self.rx_image(transitionType: nil)
public var image: AnyObserver<UIImage?> {
return image(transitionType: nil)
}
/**
@ -28,9 +28,9 @@ extension UIImageView {
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/
@available(*, deprecated, renamed: "rx_image(transitionType:)")
public func rx_imageAnimated(_ transitionType: String?) -> AnyObserver<UIImage?> {
return UIBindingObserver(UIElement: self) { imageView, image in
@available(*, deprecated, renamed: "image(transitionType:)")
public func imageAnimated(_ transitionType: String?) -> AnyObserver<UIImage?> {
return UIBindingObserver(UIElement: base) { imageView, image in
if let transitionType = transitionType {
if image != nil {
let transition = CATransition()
@ -52,8 +52,8 @@ extension UIImageView {
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/
public func rx_image(transitionType: String? = nil) -> AnyObserver<UIImage?> {
return UIBindingObserver(UIElement: self) { imageView, image in
public func image(transitionType: String? = nil) -> AnyObserver<UIImage?> {
return UIBindingObserver(UIElement: base) { imageView, image in
if let transitionType = transitionType {
if image != nil {
let transition = CATransition()

View File

@ -14,13 +14,13 @@ import RxSwift
#endif
import UIKit
extension UILabel {
extension Reactive where Base: UILabel {
/**
Bindable sink for `text` property.
*/
public var rx_text: AnyObserver<String?> {
return UIBindingObserver(UIElement: self) { label, text in
public var text: AnyObserver<String?> {
return UIBindingObserver(UIElement: self.base) { label, text in
label.text = text
}.asObserver()
}
@ -28,8 +28,8 @@ extension UILabel {
/**
Bindable sink for `attributedText` property.
*/
public var rx_attributedText: AnyObserver<NSAttributedString?> {
return UIBindingObserver(UIElement: self) { label, text in
public var attributedText: AnyObserver<NSAttributedString?> {
return UIBindingObserver(UIElement: self.base) { label, text in
label.attributedText = text
}.asObserver()
}

View File

@ -14,16 +14,16 @@ import UIKit
import RxSwift
#endif
extension UINavigationItem {
extension Reactive where Base: UINavigationItem {
/**
Bindable sink for `title` property.
*/
public var rx_title: AnyObserver<String?> {
return UIBindingObserver(UIElement: self) { navigationItem, text in
public var title: AnyObserver<String?> {
return UIBindingObserver(UIElement: self.base) { navigationItem, text in
navigationItem.title = text
}.asObserver()
}
}
#endif
#endif

View File

@ -14,13 +14,13 @@ import RxSwift
#endif
import UIKit
extension UIPageControl {
extension Reactive where Base: UIPageControl {
/**
Bindable sink for `currentPage` property.
*/
public var rx_currentPage: AnyObserver<Int> {
return UIBindingObserver(UIElement: self) { controller, page in
public var currentPage: AnyObserver<Int> {
return UIBindingObserver(UIElement: self.base) { controller, page in
controller.currentPage = page
}.asObserver()
}

View File

@ -14,17 +14,17 @@
#endif
import UIKit
extension UIPickerView {
extension Reactive where Base: UIPickerView {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxPickerViewDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxPickerViewDelegateProxy.proxyForObject(base)
}
public var rx_itemSelected: ControlEvent<(Int, Int)> {
let source = rx_delegate
public var itemSelected: ControlEvent<(Int, Int)> {
let source = delegate
.observe(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:)))
.map {
return (try castOrThrow(Int.self, $0[1]), try castOrThrow(Int.self, $0[2]))

View File

@ -14,17 +14,17 @@ import RxSwift
#endif
import UIKit
extension UIProgressView {
extension Reactive where Base: UIProgressView {
/**
Bindable sink for `progress` property
*/
public var rx_progress: AnyObserver<Float> {
return UIBindingObserver(UIElement: self) { progressView, progress in
public var progress: AnyObserver<Float> {
return UIBindingObserver(UIElement: self.base) { progressView, progress in
progressView.progress = progress
}.asObserver()
}
}
#endif
#endif

View File

@ -13,13 +13,13 @@ import UIKit
import RxSwift
#endif
extension UIRefreshControl {
extension Reactive where Base: UIRefreshControl {
/**
Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.
*/
public var rx_refreshing: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { refreshControl, refresh in
public var refreshing: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { refreshControl, refresh in
if refresh {
refreshControl.beginRefreshing()
} else {

View File

@ -17,30 +17,34 @@ import UIKit
extension UIScrollView {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxScrollViewDelegateProxy(parentObject: self)
}
}
extension Reactive where Base: UIScrollView {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxScrollViewDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxScrollViewDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `contentOffset`.
*/
public var rx_contentOffset: ControlProperty<CGPoint> {
let proxy = RxScrollViewDelegateProxy.proxyForObject(self)
public var contentOffset: ControlProperty<CGPoint> {
let proxy = RxScrollViewDelegateProxy.proxyForObject(base)
let bindingObserver = UIBindingObserver(UIElement: self) { scrollView, contentOffset in
let bindingObserver = UIBindingObserver(UIElement: self.base) { scrollView, contentOffset in
scrollView.contentOffset = contentOffset
}
@ -50,14 +54,14 @@ extension UIScrollView {
/**
Bindable sink for `scrollEnabled` property.
*/
public var rx_scrollEnabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { scrollView, scrollEnabled in
public var scrollEnabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { scrollView, scrollEnabled in
scrollView.isScrollEnabled = scrollEnabled
}.asObserver()
}
/**
Installs delegate as forwarding delegate on `rx_delegate`.
Installs delegate as forwarding delegate on `delegate`.
Delegate won't be retained.
It enables using normal delegate mechanism with reactive delegate mechanism.
@ -65,9 +69,9 @@ extension UIScrollView {
- parameter delegate: Delegate object.
- returns: Disposable object that can be used to unbind the delegate.
*/
public func rx_setDelegate(_ delegate: UIScrollViewDelegate)
public func setDelegate(_ delegate: UIScrollViewDelegate)
-> Disposable {
return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self)
return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)
}
}

View File

@ -15,44 +15,46 @@ import RxSwift
import UIKit
extension UISearchBar {
#if os(iOS)
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public func rx_createDelegateProxy() -> RxSearchBarDelegateProxy {
return RxSearchBarDelegateProxy(parentObject: self)
extension UISearchBar {
/**
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public func createRxDelegateProxy() -> RxSearchBarDelegateProxy {
return RxSearchBarDelegateProxy(parentObject: self)
}
}
#endif
extension Reactive where Base: UISearchBar {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxSearchBarDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxSearchBarDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `text` property.
*/
public var rx_text: ControlProperty<String> {
let source: Observable<String> = Observable.deferred { [weak self] () -> Observable<String> in
let text = self?.text ?? ""
public var text: ControlProperty<String> {
let source: Observable<String> = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable<String> in
let text = searchBar?.text ?? ""
return (self?.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())
return (searchBar?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())
.map { a in
return a[1] as? String ?? ""
}
.startWith(text)
}
let bindingObserver = UIBindingObserver(UIElement: self) { (searchBar, text: String) in
let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, text: String) in
searchBar.text = text
}
@ -62,18 +64,18 @@ extension UISearchBar {
/**
Reactive wrapper for `selectedScopeButtonIndex` property.
*/
public var rx_selectedScopeButtonIndex: ControlProperty<Int> {
let source: Observable<Int> = Observable.deferred { [weak self] () -> Observable<Int> in
let index = self?.selectedScopeButtonIndex ?? 0
public var selectedScopeButtonIndex: ControlProperty<Int> {
let source: Observable<Int> = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable<Int> in
let index = source?.selectedScopeButtonIndex ?? 0
return (self?.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())
return (source?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())
.map { a in
return try castOrThrow(Int.self, a[1])
}
.startWith(index)
}
let bindingObserver = UIBindingObserver(UIElement: self) { (searchBar, index: Int) in
let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, index: Int) in
searchBar.selectedScopeButtonIndex = index
}
@ -84,8 +86,8 @@ extension UISearchBar {
/**
Reactive wrapper for delegate method `searchBarCancelButtonClicked`.
*/
public var rx_cancelButtonClicked: ControlEvent<Void> {
let source: Observable<Void> = rx_delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))
public var cancelButtonClicked: ControlEvent<Void> {
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))
.map { _ in
return ()
}
@ -96,8 +98,8 @@ extension UISearchBar {
/**
Reactive wrapper for delegate method `searchBarSearchButtonClicked`.
*/
public var rx_searchButtonClicked: ControlEvent<Void> {
let source: Observable<Void> = rx_delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))
public var searchButtonClicked: ControlEvent<Void> {
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))
.map { _ in
return ()
}

View File

@ -17,51 +17,51 @@ import Foundation
import UIKit
@available(iOS 8.0, *)
extension UISearchController {
extension Reactive where Base: UISearchController {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxSearchControllerDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxSearchControllerDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didDismiss: Observable<Void> {
return rx_delegate
public var didDismiss: Observable<Void> {
return delegate
.observe( #selector(UISearchControllerDelegate.didDismissSearchController(_:)))
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_didPresent: Observable<Void> {
return rx_delegate
public var didPresent: Observable<Void> {
return delegate
.observe(#selector(UISearchControllerDelegate.didPresentSearchController(_:)))
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_present: Observable<Void> {
return rx_delegate
public var present: Observable<Void> {
return delegate
.observe( #selector(UISearchControllerDelegate.presentSearchController(_:)))
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_willDismiss: Observable<Void> {
return rx_delegate
public var willDismiss: Observable<Void> {
return delegate
.observe(#selector(UISearchControllerDelegate.willDismissSearchController(_:)))
.map {_ in}
}
/**
Reactive wrapper for `delegate` message.
*/
public var rx_willPresent: Observable<Void> {
return rx_delegate
public var willPresent: Observable<Void> {
return delegate
.observe( #selector(UISearchControllerDelegate.willPresentSearchController(_:)))
.map {_ in}
}

View File

@ -14,14 +14,14 @@ import RxSwift
#endif
extension UISegmentedControl {
extension Reactive where Base: UISegmentedControl {
/**
Reactive wrapper for `selectedSegmentIndex` property.
*/
public var rx_value: ControlProperty<Int> {
return UIControl.rx_value(
self,
public var value: ControlProperty<Int> {
return Reactive<UIControl>.value(
self.base,
getter: { segmentedControl in
segmentedControl.selectedSegmentIndex
}, setter: { segmentedControl, value in

View File

@ -14,14 +14,14 @@ import RxSwift
#endif
import UIKit
extension UISlider {
extension Reactive where Base: UISlider {
/**
Reactive wrapper for `value` property.
*/
public var rx_value: ControlProperty<Float> {
return UIControl.rx_value(
self,
public var value: ControlProperty<Float> {
return Reactive<UIControl>.value(
self.base,
getter: { slider in
slider.value
}, setter: { slider, value in

View File

@ -14,14 +14,14 @@ import UIKit
import RxSwift
#endif
extension UIStepper {
extension Reactive where Base: UIStepper {
/**
Reactive wrapper for `value` property.
*/
public var rx_value: ControlProperty<Double> {
return UIControl.rx_value(
self,
public var value: ControlProperty<Double> {
return Reactive<UIControl>.value(
self.base,
getter: { stepper in
stepper.value
}, setter: { stepper, value in

View File

@ -14,14 +14,14 @@ import RxSwift
#endif
extension UISwitch {
extension Reactive where Base: UISwitch {
/**
Reactive wrapper for `on` property.
*/
public var rx_value: ControlProperty<Bool> {
return UIControl.rx_value(
self,
public var value: ControlProperty<Bool> {
return Reactive<UIControl>.value(
self.base,
getter: { uiSwitch in
uiSwitch.isOn
}, setter: { uiSwitch, value in

View File

@ -18,14 +18,14 @@ import RxSwift
iOS only
*/
#if os(iOS)
extension UITabBar {
extension Reactive where Base: UITabBar {
/**
Reactive wrapper for `delegate` message `tabBar:willBeginCustomizingItems:`.
*/
public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {
public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {
let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))
let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))
.map { a in
return try castOrThrow([UITabBarItem].self, a[1])
}
@ -36,8 +36,8 @@ extension UITabBar {
/**
Reactive wrapper for `delegate` message `tabBar:didBeginCustomizingItems:`.
*/
public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {
let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))
public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {
let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))
.map { a in
return try castOrThrow([UITabBarItem].self, a[1])
}
@ -48,8 +48,8 @@ extension UITabBar {
/**
Reactive wrapper for `delegate` message `tabBar:willEndCustomizingItems:changed:`.
*/
public var rx_willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))
public var willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))
.map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in
let items = try castOrThrow([UITabBarItem].self, a[1])
let changed = try castOrThrow(Bool.self, a[2])
@ -62,8 +62,8 @@ extension UITabBar {
/**
Reactive wrapper for `delegate` message `tabBar:didEndCustomizingItems:changed:`.
*/
public var rx_didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))
public var didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {
let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))
.map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in
let items = try castOrThrow([UITabBarItem].self, a[1])
let changed = try castOrThrow(Bool.self, a[2])
@ -82,28 +82,31 @@ extension UITabBar {
extension UITabBar {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public func rx_createDelegateProxy() -> RxTabBarDelegateProxy {
public func createRxDelegateProxy() -> RxTabBarDelegateProxy {
return RxTabBarDelegateProxy(parentObject: self)
}
}
extension Reactive where Base: UITabBar {
/**
Reactive wrapper for `delegate`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_delegate: DelegateProxy {
return RxTabBarDelegateProxy.proxyForObject(self)
public var delegate: DelegateProxy {
return RxTabBarDelegateProxy.proxyForObject(base)
}
/**
Reactive wrapper for `delegate` message `tabBar:didSelectItem:`.
*/
public var rx_didSelectItem: ControlEvent<UITabBarItem> {
let source = rx_delegate.observe(#selector(UITabBarDelegate.tabBar(_:didSelect:)))
public var didSelectItem: ControlEvent<UITabBarItem> {
let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didSelect:)))
.map { a in
return try castOrThrow(UITabBarItem.self, a[1])
}

View File

@ -14,13 +14,13 @@
import RxSwift
#endif
extension UITabBarItem {
extension Reactive where Base: UITabBarItem {
/**
Bindable sink for `badgeValue` property.
*/
public var rx_badgeValue: AnyObserver<String?> {
return UIBindingObserver(UIElement: self) { tabBarItem, badgeValue in
public var badgeValue: AnyObserver<String?> {
return UIBindingObserver(UIElement: self.base) { tabBarItem, badgeValue in
tabBarItem.badgeValue = badgeValue
}.asObserver()
}

View File

@ -16,7 +16,7 @@ import UIKit
// Items
extension UITableView {
extension Reactive where Base: UITableView {
/**
Binds sequences of elements to table view rows.
@ -34,7 +34,7 @@ extension UITableView {
])
items
.bindTo(tableView.rx_itemsWithCellFactory) { (tableView, row, element) in
.bindTo(tableView.rx.itemsWithCellFactory) { (tableView, row, element) in
let cell = tableView.dequeueReusableCellWithIdentifier("Cell")!
cell.textLabel?.text = "\(element) @ row \(row)"
return cell
@ -42,7 +42,7 @@ extension UITableView {
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(source:cellFactory:)")
@available(*, deprecated, renamed: "items(source:cellFactory:)")
public func rx_itemsWithCellFactory<S: Sequence, O: ObservableType>
(_ source: O)
-> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell)
@ -51,7 +51,7 @@ extension UITableView {
return { cellFactory in
let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
@ -71,7 +71,7 @@ extension UITableView {
])
items
.bindTo(tableView.rx_items) { (tableView, row, element) in
.bindTo(tableView.items) { (tableView, row, element) in
let cell = tableView.dequeueReusableCellWithIdentifier("Cell")!
cell.textLabel?.text = "\(element) @ row \(row)"
return cell
@ -79,15 +79,14 @@ extension UITableView {
.addDisposableTo(disposeBag)
*/
public func rx_items<S: Sequence, O: ObservableType>
public func items<S: Sequence, O: ObservableType>
(_ source: O)
-> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell)
-> Disposable
where O.E == S {
return { cellFactory in
let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
@ -109,12 +108,12 @@ extension UITableView {
])
items
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
.bindTo(tableView.rx.itemsWithCellIdentifier("Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
}
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(cellIdentifier:cellType:source:configureCell:)")
@available(*, deprecated, renamed: "items(cellIdentifier:cellType:source:configureCell:)")
public func rx_itemsWithCellIdentifier<S: Sequence, Cell: UITableViewCell, O : ObservableType>
(_ cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (_ source: O)
@ -129,7 +128,7 @@ extension UITableView {
configureCell(i, item, cell)
return cell
}
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}
@ -152,12 +151,12 @@ extension UITableView {
])
items
.bindTo(tableView.rx_items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
.bindTo(tableView.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
}
.addDisposableTo(disposeBag)
*/
public func rx_items<S: Sequence, Cell: UITableViewCell, O : ObservableType>
public func items<S: Sequence, Cell: UITableViewCell, O : ObservableType>
(cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (_ source: O)
-> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
@ -171,7 +170,7 @@ extension UITableView {
configureCell(i, item, cell)
return cell
}
return self.rx_items(dataSource: dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}
@ -217,10 +216,10 @@ extension UITableView {
}
items
.bindTo(tableView.rx_itemsWithDataSource(dataSource))
.bindTo(tableView.rx.itemsWithDataSource(dataSource))
.addDisposableTo(disposeBag)
*/
@available(*, deprecated, renamed: "rx_items(dataSource:source:)")
@available(*, deprecated, renamed: "items(dataSource:source:)")
public func rx_itemsWithDataSource<
DataSource: RxTableViewDataSourceType & UITableViewDataSource,
O: ObservableType>
@ -231,8 +230,8 @@ extension UITableView {
{
return { source in
// There needs to be a strong retaining here because
return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxTableViewDataSourceProxy, event) -> Void in
guard let tableView = self else {
return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in
guard let tableView = tableView else {
return
}
dataSource.tableView(tableView, observedEvent: event)
@ -281,10 +280,10 @@ extension UITableView {
}
items
.bindTo(tableView.rx_items(dataSource: dataSource))
.bindTo(tableView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
*/
public func rx_items<
public func items<
DataSource: RxTableViewDataSourceType & UITableViewDataSource,
O: ObservableType>
(dataSource: DataSource)
@ -298,10 +297,10 @@ extension UITableView {
// call `self.rx_delegate`. If that happens, it might cause weird side effects since
// setting data source will set delegate, and UITableView might get into a weird state.
// Therefore it's better to set delegate proxy first, just to be sure.
_ = self.rx_delegate
_ = self.delegate
// Strong reference is needed because data source is in use until result subscription is disposed
return source.subscribeProxyDataSource(ofObject: self, dataSource: dataSource, retainDataSource: true) { [weak self] (_: RxTableViewDataSourceProxy, event) -> Void in
guard let tableView = self else {
return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in
guard let tableView = tableView else {
return
}
dataSource.tableView(tableView, observedEvent: event)
@ -314,34 +313,37 @@ extension UITableView {
extension UITableView {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxTableViewDelegateProxy(parentObject: self)
}
/**
Factory method that enables subclasses to implement their own `rx_dataSource`.
Factory method that enables subclasses to implement their own `rx.dataSource`.
- returns: Instance of delegate proxy that wraps `dataSource`.
*/
public func rx_createDataSourceProxy() -> RxTableViewDataSourceProxy {
public func createRxDataSourceProxy() -> RxTableViewDataSourceProxy {
return RxTableViewDataSourceProxy(parentObject: self)
}
}
extension Reactive where Base: UITableView {
/**
Reactive wrapper for `dataSource`.
For more information take a look at `DelegateProxyType` protocol documentation.
*/
public var rx_dataSource: DelegateProxy {
return RxTableViewDataSourceProxy.proxyForObject(self)
public var dataSource: DelegateProxy {
return RxTableViewDataSourceProxy.proxyForObject(base)
}
/**
Installs data source as forwarding delegate on `rx_dataSource`.
Installs data source as forwarding delegate on `rx.dataSource`.
Data source won't be retained.
It enables using normal delegate mechanism with reactive delegate mechanism.
@ -349,9 +351,9 @@ extension UITableView {
- parameter dataSource: Data source object.
- returns: Disposable object that can be used to unbind the data source.
*/
public func rx_setDataSource(_ dataSource: UITableViewDataSource)
public func setDataSource(_ dataSource: UITableViewDataSource)
-> Disposable {
return RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self)
return RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)
}
// events
@ -359,8 +361,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.
*/
public var rx_itemSelected: ControlEvent<IndexPath> {
let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))
public var itemSelected: ControlEvent<IndexPath> {
let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))
.map { a in
return try castOrThrow(IndexPath.self, a[1])
}
@ -371,8 +373,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.
*/
public var rx_itemDeselected: ControlEvent<IndexPath> {
let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))
public var itemDeselected: ControlEvent<IndexPath> {
let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))
.map { a in
return try castOrThrow(IndexPath.self, a[1])
}
@ -383,8 +385,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:accessoryButtonTappedForRowWithIndexPath:`.
*/
public var rx_itemAccessoryButtonTapped: ControlEvent<IndexPath> {
let source: Observable<IndexPath> = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))
public var itemAccessoryButtonTapped: ControlEvent<IndexPath> {
let source: Observable<IndexPath> = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))
.map { a in
return try castOrThrow(IndexPath.self, a[1])
}
@ -395,8 +397,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.
*/
public var rx_itemInserted: ControlEvent<IndexPath> {
let source = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
public var itemInserted: ControlEvent<IndexPath> {
let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
.filter { a in
return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .insert
}
@ -410,8 +412,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.
*/
public var rx_itemDeleted: ControlEvent<IndexPath> {
let source = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
public var itemDeleted: ControlEvent<IndexPath> {
let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))
.filter { a in
return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .delete
}
@ -425,8 +427,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:moveRowAtIndexPath:toIndexPath:`.
*/
public var rx_itemMoved: ControlEvent<ItemMovedEvent> {
let source: Observable<ItemMovedEvent> = rx_dataSource.observe(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))
public var itemMoved: ControlEvent<ItemMovedEvent> {
let source: Observable<ItemMovedEvent> = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))
.map { a in
return (try castOrThrow(IndexPath.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
}
@ -437,8 +439,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:willDisplayCell:forRowAtIndexPath:`.
*/
public var rx_willDisplayCell: ControlEvent<WillDisplayCellEvent> {
let source: Observable<WillDisplayCellEvent> = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))
public var willDisplayCell: ControlEvent<WillDisplayCellEvent> {
let source: Observable<WillDisplayCellEvent> = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))
.map { a in
return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
}
@ -449,8 +451,8 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didEndDisplayingCell:forRowAtIndexPath:`.
*/
public var rx_didEndDisplayingCell: ControlEvent<DidEndDisplayingCellEvent> {
let source: Observable<DidEndDisplayingCellEvent> = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))
public var didEndDisplayingCell: ControlEvent<DidEndDisplayingCellEvent> {
let source: Observable<DidEndDisplayingCellEvent> = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))
.map { a in
return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))
}
@ -461,21 +463,21 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.
It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
or any other data source conforming to `SectionedViewDataSourceType` protocol.
```
tableView.rx_modelSelected(MyModel.self)
tableView.rx.modelSelected(MyModel.self)
.map { ...
```
*/
public func rx_modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemSelected.flatMap { [weak self] indexPath -> Observable<T> in
guard let view = self else {
public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = self.itemSelected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in
guard let view = view else {
return Observable.empty()
}
return Observable.just(try view.rx_modelAtIndexPath(indexPath))
return Observable.just(try view.rx.modelAtIndexPath(indexPath))
}
return ControlEvent(events: source)
@ -484,21 +486,21 @@ extension UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.
It can be only used when one of the `rx_itemsWith*` methods is used to bind observable sequence,
It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,
or any other data source conforming to `SectionedViewDataSourceType` protocol.
```
tableView.rx_modelDeselected(MyModel.self)
tableView.rx.modelDeselected(MyModel.self)
.map { ...
```
*/
public func rx_modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = rx_itemDeselected.flatMap { [weak self] indexPath -> Observable<T> in
guard let view = self else {
public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {
let source: Observable<T> = self.itemDeselected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in
guard let view = view else {
return Observable.empty()
}
return Observable.just(try view.rx_modelAtIndexPath(indexPath))
return Observable.just(try view.rx.modelAtIndexPath(indexPath))
}
return ControlEvent(events: source)
@ -507,8 +509,8 @@ extension UITableView {
/**
Synchronous helper method for retrieving a model at indexPath through a reactive data source.
*/
public func rx_modelAtIndexPath<T>(_ indexPath: IndexPath) throws -> T {
let dataSource: SectionedViewDataSourceType = castOrFatalError(self.rx_dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx_items*` methods was used.")
public func modelAtIndexPath<T>(_ indexPath: IndexPath) throws -> T {
let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.items*` methods was used.")
let element = try dataSource.modelAtIndexPath(indexPath)
@ -520,14 +522,14 @@ extension UITableView {
#if os(tvOS)
extension UITableView {
extension Reactive where Base: UITableView {
/**
Reactive wrapper for `delegate` message `tableView:didUpdateFocusInContext:withAnimationCoordinator:`.
*/
public var rx_didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {
let source = rx_delegate.observe(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))
let source = delegate.observe(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))
.map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in
let context = a[1] as! UIFocusUpdateContext
let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2])

View File

@ -14,14 +14,14 @@ import RxSwift
#endif
import UIKit
extension UITextField : RxTextInput {
extension Reactive where Base: UITextField {
/**
Reactive wrapper for `text` property.
*/
public var rx_text: ControlProperty<String> {
return UIControl.rx_value(
self,
public var text: ControlProperty<String> {
return Reactive<UIControl>.value(
base,
getter: { textField in
textField.text ?? ""
}, setter: { textField, value in

View File

@ -16,35 +16,37 @@ import RxSwift
extension UITextView : RxTextInput {
extension UITextView {
/**
Factory method that enables subclasses to implement their own `rx_delegate`.
Factory method that enables subclasses to implement their own `delegate`.
- returns: Instance of delegate proxy that wraps `delegate`.
*/
public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxTextViewDelegateProxy(parentObject: self)
}
}
extension Reactive where Base: UITextView {
/**
Reactive wrapper for `text` property.
*/
public var rx_text: ControlProperty<String> {
let source: Observable<String> = Observable.deferred { [weak self] in
let text = self?.text ?? ""
public var text: ControlProperty<String> {
let source: Observable<String> = Observable.deferred { [weak textView = self.base] in
let text = textView?.text ?? ""
let textChanged = self?.textStorage
let textChanged = textView?.textStorage
// This project uses text storage notifications because
// that's the only way to catch autocorrect changes
// in all cases. Other suggestions are welcome.
.rx_didProcessEditingRangeChangeInLength
.rx.didProcessEditingRangeChangeInLength
// This observe on is here because text storage
// will emit event while process is not completely done,
// so rebinding a value will cause an exception to be thrown.
.observeOn(MainScheduler.asyncInstance)
.map { _ in
return self?.textStorage.string ?? ""
return textView?.textStorage.string ?? ""
}
?? Observable.empty()
@ -52,7 +54,7 @@ extension UITextView : RxTextInput {
.startWith(text)
}
let bindingObserver = UIBindingObserver(UIElement: self) { (textView, text: String) in
let bindingObserver = UIBindingObserver(UIElement: self.base) { (textView, text: String) in
// This check is important because setting text value always clears control state
// including marked text selection which is imporant for proper input
// when IME input method is used.

View File

@ -14,12 +14,12 @@ import UIKit
import RxSwift
#endif
extension UIView {
extension Reactive where Base: UIView {
/**
Bindable sink for `hidden` property.
*/
public var rx_hidden: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { view, hidden in
public var hidden: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self.base) { view, hidden in
view.isHidden = hidden
}.asObserver()
}
@ -27,8 +27,8 @@ extension UIView {
/**
Bindable sink for `alpha` property.
*/
public var rx_alpha: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self) { view, alpha in
public var alpha: AnyObserver<CGFloat> {
return UIBindingObserver(UIElement: self.base) { view, alpha in
view.alpha = alpha
}.asObserver()
}

View File

@ -15,15 +15,15 @@ import Foundation
import RxSwift
#endif
extension UIViewController {
extension Reactive where Base: UIViewController {
/**
Bindable sink for `title`.
*/
public var rx_title: AnyObserver<String> {
return UIBindingObserver(UIElement: self) { viewController, title in
public var title: AnyObserver<String> {
return UIBindingObserver(UIElement: self.base) { viewController, title in
viewController.title = title
}.asObserver()
}
}
#endif
#endif

View File

@ -13,9 +13,9 @@ import RxSwift
import RxCocoa
#endif
extension UITableView {
@available(*, deprecated:0.7, renamed:"rx_itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
public func rx_itemsAnimatedWithDataSource<
extension Reactive where Base: UITableView {
@available(*, deprecated:0.7, renamed:"itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
public func itemsAnimatedWithDataSource<
DataSource: RxTableViewDataSourceType & UITableViewDataSource,
S: Sequence,
O: ObservableType>
@ -28,14 +28,14 @@ extension UITableView {
S.Iterator.Element: AnimatableSectionModelType
{
return { source in
return self.rx_itemsWithDataSource(dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}
extension UICollectionView {
@available(*, deprecated:0.7, renamed:"rx_itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
public func rx_itemsAnimatedWithDataSource<
extension Reactive where Base: UICollectionView {
@available(*, deprecated:0.7, renamed:"itemsWithDataSource", message:"You can just use normal `rx_itemsWithDataSource` extension.")
public func itemsAnimatedWithDataSource<
DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,
S: Sequence,
O: ObservableType>
@ -48,7 +48,7 @@ extension UICollectionView {
S.Iterator.Element: AnimatableSectionModelType
{
return { source in
return self.rx_itemsWithDataSource(dataSource)(source)
return self.items(dataSource: dataSource)(source)
}
}
}

View File

@ -62,7 +62,7 @@ class APIWrappersViewController: ViewController {
// MARK: UIBarButtonItem
bbitem.rx_tap
bbitem.rx.tap
.subscribe(onNext: { [weak self] x in
self?.debug("UIBarButtonItem Tapped")
})
@ -72,7 +72,7 @@ class APIWrappersViewController: ViewController {
// also test two way binding
let segmentedValue = Variable(0)
_ = segmentedControl.rx_value <-> segmentedValue
_ = segmentedControl.rx.value <-> segmentedValue
segmentedValue.asObservable()
.subscribe(onNext: { [weak self] x in
@ -85,7 +85,7 @@ class APIWrappersViewController: ViewController {
// also test two way binding
let switchValue = Variable(true)
_ = switcher.rx_value <-> switchValue
_ = switcher.rx.value <-> switchValue
switchValue.asObservable()
.subscribe(onNext: { [weak self] x in
@ -95,14 +95,14 @@ class APIWrappersViewController: ViewController {
// MARK: UIActivityIndicatorView
switcher.rx_value
.bindTo(activityIndicator.rx_animating)
switcher.rx.value
.bindTo(activityIndicator.rx.animating)
.addDisposableTo(disposeBag)
// MARK: UIButton
button.rx_tap
button.rx.tap
.subscribe(onNext: { [weak self] x in
self?.debug("UIButton Tapped")
})
@ -113,7 +113,7 @@ class APIWrappersViewController: ViewController {
// also test two way binding
let sliderValue = Variable<Float>(1.0)
_ = slider.rx_value <-> sliderValue
_ = slider.rx.value <-> sliderValue
sliderValue.asObservable()
.subscribe(onNext: { [weak self] x in
@ -126,7 +126,7 @@ class APIWrappersViewController: ViewController {
// also test two way binding
let dateValue = Variable(Date(timeIntervalSince1970: 0))
_ = datePicker.rx_date <-> dateValue
_ = datePicker.rx.date <-> dateValue
dateValue.asObservable()
@ -151,7 +151,7 @@ class APIWrappersViewController: ViewController {
// MARK: UIGestureRecognizer
mypan.rx_event
mypan.rx.event
.subscribe(onNext: { [weak self] x in
self?.debug("UIGestureRecognizer event \(x.state)")
})
@ -162,7 +162,7 @@ class APIWrappersViewController: ViewController {
// also test two way binding
let textViewValue = Variable("")
_ = textView <-> textViewValue
_ = textView! <-> textViewValue
textViewValue.asObservable()
.subscribe(onNext: { [weak self] x in
@ -176,18 +176,18 @@ class APIWrappersViewController: ViewController {
manager.requestWhenInUseAuthorization()
#endif
manager.rx_didUpdateLocations
manager.rx.didUpdateLocations
.subscribe(onNext: { x in
print("rx_didUpdateLocations \(x)")
})
.addDisposableTo(disposeBag)
_ = manager.rx_didFailWithError
_ = manager.rx.didFailWithError
.subscribe(onNext: { x in
print("rx_didFailWithError \(x)")
})
manager.rx_didChangeAuthorizationStatus
manager.rx.didChangeAuthorizationStatus
.subscribe(onNext: { status in
print("Authorization status \(status)")
})

View File

@ -43,30 +43,30 @@ class CalculatorViewController: ViewController {
override func viewDidLoad() {
let commands:[Observable<Action>] = [
allClearButton.rx_tap.map { _ in .clear },
allClearButton.rx.tap.map { _ in .clear },
changeSignButton.rx_tap.map { _ in .changeSign },
percentButton.rx_tap.map { _ in .percent },
changeSignButton.rx.tap.map { _ in .changeSign },
percentButton.rx.tap.map { _ in .percent },
divideButton.rx_tap.map { _ in .operation(.division) },
multiplyButton.rx_tap.map { _ in .operation(.multiplication) },
minusButton.rx_tap.map { _ in .operation(.subtraction) },
plusButton.rx_tap.map { _ in .operation(.addition) },
divideButton.rx.tap.map { _ in .operation(.division) },
multiplyButton.rx.tap.map { _ in .operation(.multiplication) },
minusButton.rx.tap.map { _ in .operation(.subtraction) },
plusButton.rx.tap.map { _ in .operation(.addition) },
equalButton.rx_tap.map { _ in .equal },
equalButton.rx.tap.map { _ in .equal },
dotButton.rx_tap.map { _ in .addDot },
dotButton.rx.tap.map { _ in .addDot },
zeroButton.rx_tap.map { _ in .addNumber("0") },
oneButton.rx_tap.map { _ in .addNumber("1") },
twoButton.rx_tap.map { _ in .addNumber("2") },
threeButton.rx_tap.map { _ in .addNumber("3") },
fourButton.rx_tap.map { _ in .addNumber("4") },
fiveButton.rx_tap.map { _ in .addNumber("5") },
sixButton.rx_tap.map { _ in .addNumber("6") },
sevenButton.rx_tap.map { _ in .addNumber("7") },
eightButton.rx_tap.map { _ in .addNumber("8") },
nineButton.rx_tap.map { _ in .addNumber("9") }
zeroButton.rx.tap.map { _ in .addNumber("0") },
oneButton.rx.tap.map { _ in .addNumber("1") },
twoButton.rx.tap.map { _ in .addNumber("2") },
threeButton.rx.tap.map { _ in .addNumber("3") },
fourButton.rx.tap.map { _ in .addNumber("4") },
fiveButton.rx.tap.map { _ in .addNumber("5") },
sixButton.rx.tap.map { _ in .addNumber("6") },
sevenButton.rx.tap.map { _ in .addNumber("7") },
eightButton.rx.tap.map { _ in .addNumber("8") },
nineButton.rx.tap.map { _ in .addNumber("9") }
]
Observable.from(commands)

View File

@ -13,17 +13,17 @@ import CoreLocation
import RxCocoa
#endif
private extension UILabel {
var rx_driveCoordinates: AnyObserver<CLLocationCoordinate2D> {
return UIBindingObserver(UIElement: self) { label, location in
private extension Reactive where Base: UILabel {
var driveCoordinates: AnyObserver<CLLocationCoordinate2D> {
return UIBindingObserver(UIElement: base) { label, location in
label.text = "Lat: \(location.latitude)\nLon: \(location.longitude)"
}.asObserver()
}
}
private extension UIView {
var rx_driveAuthorization: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { view, authorized in
private extension Reactive where Base: UIView {
var driveAuthorization: AnyObserver<Bool> {
return UIBindingObserver(UIElement: base) { view, authorized in
if authorized {
view.isHidden = true
view.superview?.sendSubview(toBack:view)
@ -49,20 +49,20 @@ class GeolocationViewController: ViewController {
let geolocationService = GeolocationService.instance
geolocationService.authorized
.drive(noGeolocationView.rx_driveAuthorization)
.drive(noGeolocationView.rx.driveAuthorization)
.addDisposableTo(disposeBag)
geolocationService.location
.drive(label.rx_driveCoordinates)
.drive(label.rx.driveCoordinates)
.addDisposableTo(disposeBag)
button.rx_tap
button.rx.tap
.bindNext { [weak self] in
self?.openAppPreferences()
}
.addDisposableTo(disposeBag)
button2.rx_tap
button2.rx.tap
.bindNext { [weak self] in
self?.openAppPreferences()
}

View File

@ -165,7 +165,7 @@ extension GitHubSearchRepositoriesAPI {
private func loadSearchURL(_ searchURL: URL) -> Observable<SearchRepositoryResponse> {
return URLSession.shared
.rx_response(URLRequest(url: searchURL))
.rx.response(URLRequest(url: searchURL))
.retry(3)
.trackActivity(self.activityIndicator)
.observeOn(Dependencies.sharedDependencies.backgroundWorkScheduler)

View File

@ -48,14 +48,14 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
}
let loadNextPageTrigger = self.tableView.rx_contentOffset
let loadNextPageTrigger = self.tableView.rx.contentOffset
.flatMap { _ in
self.tableView.isNearBottomEdge(edgeOffset: 20.0)
? Observable.just(())
: Observable.empty()
}
let searchResult = self.searchBar.rx_text.asDriver()
let searchResult = self.searchBar.rx.text.asDriver()
.throttle(0.3)
.distinctUntilChanged()
.flatMapLatest { query -> Driver<RepositoriesState> in
@ -69,12 +69,12 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
searchResult
.map { $0.serviceState }
.drive(navigationController!.rx_serviceState)
.drive(navigationController!.rx.serviceState)
.addDisposableTo(disposeBag)
searchResult
.map { [SectionModel(model: "Repositories", items: $0.repositories)] }
.drive(tableView.rx_items(dataSource: dataSource))
.drive(tableView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
searchResult
@ -85,7 +85,7 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
.addDisposableTo(disposeBag)
// dismiss keyboard on scroll
tableView.rx_contentOffset
tableView.rx.contentOffset
.subscribe { _ in
if self.searchBar.isFirstResponder {
_ = self.searchBar.resignFirstResponder()
@ -94,13 +94,13 @@ class GitHubSearchRepositoriesViewController: ViewController, UITableViewDelegat
.addDisposableTo(disposeBag)
// so normal delegate customization can also be used
tableView.rx_setDelegate(self)
tableView.rx.setDelegate(self)
.addDisposableTo(disposeBag)
// activity indicator in status bar
// {
GitHubSearchRepositoriesAPI.sharedAPI.activityIndicator
.drive(UIApplication.shared.rx_networkActivityIndicatorVisible)
.drive(UIApplication.shared.rx.networkActivityIndicatorVisible)
.addDisposableTo(disposeBag)
// }
}

View File

@ -18,14 +18,14 @@ struct Colors {
static let OnlineColor = nil as UIColor?
}
extension UINavigationController {
var rx_serviceState: AnyObserver<ServiceState?> {
return UIBindingObserver(UIElement: self) { navigationController, maybeServiceState in
extension Reactive where Base: UINavigationController {
var serviceState: AnyObserver<ServiceState?> {
return UIBindingObserver(UIElement: base) { navigationController, maybeServiceState in
// if nil is being bound, then don't change color, it's not perfect, but :)
if let serviceState = maybeServiceState {
let isOffline = serviceState == .offline
self.navigationBar.backgroundColor = isOffline
navigationController.navigationBar.backgroundColor = isOffline
? Colors.OfflineColor
: Colors.OnlineColor
}

View File

@ -48,9 +48,9 @@ extension ValidationResult {
}
}
extension UILabel {
var ex_validationResult: AnyObserver<ValidationResult> {
return UIBindingObserver(UIElement: self) { label, result in
extension Reactive where Base: UILabel {
var validationResult: AnyObserver<ValidationResult> {
return UIBindingObserver(UIElement: base) { label, result in
label.textColor = result.textColor
label.text = result.description
}.asObserver()

View File

@ -95,7 +95,7 @@ class GitHubDefaultAPI : GitHubAPI {
let url = URL(string: "https://github.com/\(username.URLEscaped)")!
let request = URLRequest(url: url)
return self.URLSession.rx_response(request)
return self.URLSession.rx.response(request)
.map { (maybeData, response) in
return response.statusCode == 404
}

View File

@ -31,10 +31,10 @@ class GitHubSignupViewController2 : ViewController {
let viewModel = GithubSignupViewModel2(
input: (
username: usernameOutlet.rx_text.asDriver(),
password: passwordOutlet.rx_text.asDriver(),
repeatedPassword: repeatedPasswordOutlet.rx_text.asDriver(),
loginTaps: signupOutlet.rx_tap.asDriver()
username: usernameOutlet.rx.text.asDriver(),
password: passwordOutlet.rx.text.asDriver(),
repeatedPassword: repeatedPasswordOutlet.rx.text.asDriver(),
loginTaps: signupOutlet.rx.tap.asDriver()
),
dependency: (
API: GitHubDefaultAPI.sharedAPI,
@ -52,19 +52,19 @@ class GitHubSignupViewController2 : ViewController {
.addDisposableTo(disposeBag)
viewModel.validatedUsername
.drive(usernameValidationOutlet.ex_validationResult)
.drive(usernameValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.validatedPassword
.drive(passwordValidationOutlet.ex_validationResult)
.drive(passwordValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.validatedPasswordRepeated
.drive(repeatedPasswordValidationOutlet.ex_validationResult)
.drive(repeatedPasswordValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.signingIn
.drive(signingUpOulet.rx_animating)
.drive(signingUpOulet.rx.animating)
.addDisposableTo(disposeBag)
viewModel.signedIn
@ -75,7 +75,7 @@ class GitHubSignupViewController2 : ViewController {
//}
let tapBackground = UITapGestureRecognizer()
tapBackground.rx_event
tapBackground.rx.event
.subscribe(onNext: { [weak self] _ in
self?.view.endEditing(true)
})

View File

@ -31,10 +31,10 @@ class GitHubSignupViewController1 : ViewController {
let viewModel = GithubSignupViewModel1(
input: (
username: usernameOutlet.rx_text.asObservable(),
password: passwordOutlet.rx_text.asObservable(),
repeatedPassword: repeatedPasswordOutlet.rx_text.asObservable(),
loginTaps: signupOutlet.rx_tap.asObservable()
username: usernameOutlet.rx.text.asObservable(),
password: passwordOutlet.rx.text.asObservable(),
repeatedPassword: repeatedPasswordOutlet.rx.text.asObservable(),
loginTaps: signupOutlet.rx.tap.asObservable()
),
dependency: (
API: GitHubDefaultAPI.sharedAPI,
@ -52,19 +52,19 @@ class GitHubSignupViewController1 : ViewController {
.addDisposableTo(disposeBag)
viewModel.validatedUsername
.bindTo(usernameValidationOutlet.ex_validationResult)
.bindTo(usernameValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.validatedPassword
.bindTo(passwordValidationOutlet.ex_validationResult)
.bindTo(passwordValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.validatedPasswordRepeated
.bindTo(repeatedPasswordValidationOutlet.ex_validationResult)
.bindTo(repeatedPasswordValidationOutlet.rx.validationResult)
.addDisposableTo(disposeBag)
viewModel.signingIn
.bindTo(signingUpOulet.rx_animating)
.bindTo(signingUpOulet.rx.animating)
.addDisposableTo(disposeBag)
viewModel.signedIn
@ -75,7 +75,7 @@ class GitHubSignupViewController1 : ViewController {
//}
let tapBackground = UITapGestureRecognizer()
tapBackground.rx_event
tapBackground.rx.event
.subscribe(onNext: { [weak self] _ in
self?.view.endEditing(true)
})

View File

@ -26,51 +26,51 @@ class ImagePickerController: ViewController {
cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
cameraButton.rx_tap
cameraButton.rx.tap
.flatMapLatest { [weak self] _ in
return UIImagePickerController.rx_createWithParent(self) { picker in
return Reactive<UIImagePickerController>.createWithParent(self) { picker in
picker.sourceType = .camera
picker.allowsEditing = false
}
.flatMap { $0.rx_didFinishPickingMediaWithInfo }
.flatMap { $0.rx.didFinishPickingMediaWithInfo }
.take(1)
}
.map { info in
return info[UIImagePickerControllerOriginalImage] as? UIImage
}
.bindTo(imageView.rx_image)
.bindTo(imageView.rx.image)
.addDisposableTo(disposeBag)
galleryButton.rx_tap
galleryButton.rx.tap
.flatMapLatest { [weak self] _ in
return UIImagePickerController.rx_createWithParent(self) { picker in
return Reactive<UIImagePickerController>.createWithParent(self) { picker in
picker.sourceType = .photoLibrary
picker.allowsEditing = false
}
.flatMap {
$0.rx_didFinishPickingMediaWithInfo
$0.rx.didFinishPickingMediaWithInfo
}
.take(1)
}
.map { info in
return info[UIImagePickerControllerOriginalImage] as? UIImage
}
.bindTo(imageView.rx_image)
.bindTo(imageView.rx.image)
.addDisposableTo(disposeBag)
cropButton.rx_tap
cropButton.rx.tap
.flatMapLatest { [weak self] _ in
return UIImagePickerController.rx_createWithParent(self) { picker in
return Reactive<UIImagePickerController>.createWithParent(self) { picker in
picker.sourceType = .photoLibrary
picker.allowsEditing = true
}
.flatMap { $0.rx_didFinishPickingMediaWithInfo }
.flatMap { $0.rx.didFinishPickingMediaWithInfo }
.take(1)
}
.map { info in
return info[UIImagePickerControllerEditedImage] as? UIImage
}
.bindTo(imageView.rx_image)
.bindTo(imageView.rx.image)
.addDisposableTo(disposeBag)
}

View File

@ -27,12 +27,12 @@ func dismissViewController(_ viewController: UIViewController, animated: Bool) {
}
}
extension UIImagePickerController {
static func rx_createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable<UIImagePickerController> {
extension Reactive where Base: UIImagePickerController {
static func createWithParent(_ parent: UIViewController?, animated: Bool = true, configureImagePicker: @escaping (UIImagePickerController) throws -> () = { x in }) -> Observable<UIImagePickerController> {
return Observable.create { [weak parent] observer in
let imagePicker = UIImagePickerController()
let dismissDisposable = imagePicker
.rx_didCancel
let dismissDisposable = imagePicker.rx
.didCancel
.subscribe(onNext: { [weak imagePicker] in
guard let imagePicker = imagePicker else {
return

View File

@ -23,11 +23,11 @@ class NumbersViewController: ViewController {
override func viewDidLoad() {
super.viewDidLoad()
Observable.combineLatest(number1.rx_text, number2.rx_text, number3.rx_text) { textValue1, textValue2, textValue3 -> Int in
Observable.combineLatest(number1.rx.text, number2.rx.text, number3.rx.text) { textValue1, textValue2, textValue3 -> Int in
return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
}
.map { $0.description }
.bindTo(result.rx_text)
.bindTo(result.rx.text)
.addDisposableTo(disposeBag)
}
}

View File

@ -27,7 +27,7 @@ class IntroductionExampleViewController : ViewController {
showAlert("After you close this, prepare for a loud sound ...")
// c = a + b
let sum = Observable.combineLatest(a.rx_text, b.rx_text) { (a: String, b: String) -> (Int, Int) in
let sum = Observable.combineLatest(a.rx.text, b.rx.text) { (a: String, b: String) -> (Int, Int) in
return (Int(a) ?? 0, Int(b) ?? 0)
}
@ -36,7 +36,7 @@ class IntroductionExampleViewController : ViewController {
.map { (a, b) in
return "\(a + b)"
}
.bindTo(c.rx_text)
.bindTo(c.rx.text)
.addDisposableTo(disposeBag)
// Also, tell it out loud
@ -56,13 +56,13 @@ class IntroductionExampleViewController : ViewController {
.addDisposableTo(disposeBag)
slider.rx_value
slider.rx.value
.subscribe(onNext: { value in
self.sliderValue.stringValue = "\(Int(value))"
})
.addDisposableTo(disposeBag)
sliderValue.rx_text
sliderValue.rx.text
.subscribe(onNext: { value in
let doubleValue = value.toDouble() ?? 0.0
self.slider.doubleValue = doubleValue
@ -70,7 +70,7 @@ class IntroductionExampleViewController : ViewController {
})
.addDisposableTo(disposeBag)
disposeButton.rx_tap
disposeButton.rx.tap
.subscribe(onNext: { [weak self] _ in
print("Unbind everything")
self?.disposeBag = DisposeBag()

View File

@ -26,21 +26,21 @@ class SimpleTableViewExampleViewController : ViewController {
])
items
.bindTo(tableView.rx_items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
cell.textLabel?.text = "\(element) @ row \(row)"
}
.addDisposableTo(disposeBag)
tableView
.rx_modelSelected(String.self)
tableView.rx
.modelSelected(String.self)
.subscribe(onNext: { value in
DefaultWireframe.presentAlert("Tapped `\(value)`")
})
.addDisposableTo(disposeBag)
tableView
.rx_itemAccessoryButtonTapped
tableView.rx
.itemAccessoryButtonTapped
.subscribe(onNext: { indexPath in
DefaultWireframe.presentAlert("Tapped Detail @ \(indexPath.section),\(indexPath.row)")
})

View File

@ -50,11 +50,11 @@ class SimpleTableViewExampleSectionedViewController
}
items
.bindTo(tableView.rx_items(dataSource: dataSource))
.bindTo(tableView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
tableView
.rx_itemSelected
tableView.rx
.itemSelected
.map { indexPath in
return (indexPath, dataSource.itemAtIndexPath(indexPath))
}
@ -63,8 +63,8 @@ class SimpleTableViewExampleSectionedViewController
})
.addDisposableTo(disposeBag)
tableView
.rx_setDelegate(self)
tableView.rx
.setDelegate(self)
.addDisposableTo(disposeBag)
}

View File

@ -32,11 +32,11 @@ class SimpleValidationViewController : ViewController {
usernameValidOutlet.text = "Username has to be at least \(minimalUsernameLength) characters"
passwordValidOutlet.text = "Password has to be at least \(minimalPasswordLength) characters"
let usernameValid = usernameOutlet.rx_text
let usernameValid = usernameOutlet.rx.text
.map { $0.characters.count >= minimalUsernameLength }
.shareReplay(1) // without this map would be executed once for each binding, rx is stateless by default
let passwordValid = passwordOutlet.rx_text
let passwordValid = passwordOutlet.rx.text
.map { $0.characters.count >= minimalPasswordLength }
.shareReplay(1)
@ -44,22 +44,22 @@ class SimpleValidationViewController : ViewController {
.shareReplay(1)
usernameValid
.bindTo(passwordOutlet.rx_enabled)
.bindTo(passwordOutlet.rx.enabled)
.addDisposableTo(disposeBag)
usernameValid
.bindTo(usernameValidOutlet.rx_hidden)
.bindTo(usernameValidOutlet.rx.hidden)
.addDisposableTo(disposeBag)
passwordValid
.bindTo(passwordValidOutlet.rx_hidden)
.bindTo(passwordValidOutlet.rx.hidden)
.addDisposableTo(disposeBag)
everythingValid
.bindTo(doSomethingOutlet.rx_enabled)
.bindTo(doSomethingOutlet.rx.enabled)
.addDisposableTo(disposeBag)
doSomethingOutlet.rx_tap
doSomethingOutlet.rx.tap
.subscribe(onNext: { [weak self] in self?.showAlert() })
.addDisposableTo(disposeBag)
}

View File

@ -85,11 +85,11 @@ class PartialUpdatesViewController : ViewController {
skinTableViewDataSource(reloadDataSource)
self.sections.asObservable()
.bindTo(partialUpdatesTableViewOutlet.rx_items(dataSource: tvAnimatedDataSource))
.bindTo(partialUpdatesTableViewOutlet.rx.items(dataSource: tvAnimatedDataSource))
.addDisposableTo(disposeBag)
self.sections.asObservable()
.bindTo(reloadTableViewOutlet.rx_items(dataSource: reloadDataSource))
.bindTo(reloadTableViewOutlet.rx.items(dataSource: reloadDataSource))
.addDisposableTo(disposeBag)
// Collection view logic works, but when clicking fast because of internal bugs
@ -109,25 +109,25 @@ class PartialUpdatesViewController : ViewController {
skinCollectionViewDataSource(cvAnimatedDataSource)
updates
.bindTo(partialUpdatesCollectionViewOutlet.rx_itemsWithDataSource(cvAnimatedDataSource))
.bindTo(partialUpdatesCollectionViewOutlet.rx.itemsWithDataSource(cvAnimatedDataSource))
.addDisposableTo(disposeBag)
#else
let cvReloadDataSource = RxCollectionViewSectionedReloadDataSource<NumberSection>()
skinCollectionViewDataSource(cvReloadDataSource)
self.sections.asObservable()
.bindTo(partialUpdatesCollectionViewOutlet.rx_items(dataSource: cvReloadDataSource))
.bindTo(partialUpdatesCollectionViewOutlet.rx.items(dataSource: cvReloadDataSource))
.addDisposableTo(disposeBag)
#endif
// touches
partialUpdatesCollectionViewOutlet.rx_itemSelected
partialUpdatesCollectionViewOutlet.rx.itemSelected
.subscribe(onNext: { [weak self] i in
print("Let me guess, it's .... It's \(self?.generator.sections[i.section].items[i.item]), isn't it? Yeah, I've got it.")
})
.addDisposableTo(disposeBag)
Observable.of(partialUpdatesTableViewOutlet.rx_itemSelected, reloadTableViewOutlet.rx_itemSelected)
Observable.of(partialUpdatesTableViewOutlet.rx.itemSelected, reloadTableViewOutlet.rx.itemSelected)
.merge()
.subscribe(onNext: { [weak self] i in
print("I have a feeling it's .... \(self?.generator.sections[i.section].items[i.item])?")

View File

@ -28,12 +28,12 @@ class DetailViewController: ViewController {
let url = URL(string: user.imageURL)!
let request = URLRequest(url: url)
URLSession.shared.rx_data(request)
URLSession.shared.rx.data(request)
.map { data in
UIImage(data: data)
}
.observeOn($.mainScheduler)
.subscribe(imageView.rx_image)
.subscribe(imageView.rx.image)
.addDisposableTo(disposeBag)
label.text = user.firstName + " " + user.lastName

View File

@ -19,7 +19,7 @@ class RandomUserAPI {
func getExampleUserResultSet() -> Observable<[User]> {
let url = URL(string: "http://api.randomuser.me/?results=20")!
return URLSession.shared.rx_JSON(url)
return URLSession.shared.rx.JSON(url)
.map { json in
guard let json = json as? [String: AnyObject] else {
throw exampleError("Casting to dictionary failed")

View File

@ -83,10 +83,10 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
.concat(loadFavoriteUsers)
.observeOn(MainScheduler.instance)
let deleteUserCommand = tableView.rx_itemDeleted.map(TableViewEditingCommand.deleteUser)
let deleteUserCommand = tableView.rx.itemDeleted.map(TableViewEditingCommand.deleteUser)
let moveUserCommand = tableView
.rx_itemMoved
// This is needed because rx_itemMoved is being performed before delegate method is
.rx.itemMoved
// This is needed because rx.itemMoved is being performed before delegate method is
// delegated to RxDataSource.
// This observeOn makes sure data is rebound after automatic move is performed in data source.
// This will be improved in RxSwift 3.0 when order will be inversed.
@ -107,10 +107,10 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
SectionModel(model: "Normal Users", items: $0.users)
]
}
.bindTo(tableView.rx_items(dataSource: dataSource))
.bindTo(tableView.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
tableView.rx_itemSelected
tableView.rx.itemSelected
.withLatestFrom(viewModel) { i, viewModel in
let all = [viewModel.favoriteUsers, viewModel.users]
return all[i.section][i.row]
@ -122,7 +122,7 @@ class TableViewWithEditingCommandsViewController: ViewController, UITableViewDel
// customization using delegate
// RxTableViewDelegateBridge will forward correct messages
tableView.rx_setDelegate(self)
tableView.rx.setDelegate(self)
.addDisposableTo(disposeBag)
}

View File

@ -24,7 +24,7 @@ public class CollectionViewImageCell: UICollectionViewCell {
self.downloadableImage?
.asDriver(onErrorJustReturn: DownloadableImage.offlinePlaceholder)
.drive(imageOutlet.rxex_downloadableImageAnimated(kCATransitionFade))
.drive(imageOutlet.rx.downloadableImageAnimated(kCATransitionFade))
.addDisposableTo(disposeBag)
self.disposeBag = disposeBag

View File

@ -35,14 +35,14 @@ public class WikipediaSearchCell: UITableViewCell {
viewModel.title
.map(Optional.init)
.drive(self.titleOutlet.rx_text)
.drive(self.titleOutlet.rx.text)
.addDisposableTo(disposeBag)
self.URLOutlet.text = viewModel.searchResult.URL.absoluteString
let reachabilityService = Dependencies.sharedDependencies.reachabilityService
viewModel.imageURLs
.drive(self.imagesOutlet.rx_items(cellIdentifier: "ImageCell", cellType: CollectionViewImageCell.self)) { [weak self] (_, url, cell) in
.drive(self.imagesOutlet.rx.items(cellIdentifier: "ImageCell", cellType: CollectionViewImageCell.self)) { [weak self] (_, url, cell) in
cell.downloadableImage = self?.imageService.imageFromURL(url, reachabilityService: reachabilityService) ?? Observable.empty()
}
.addDisposableTo(disposeBag)

View File

@ -64,7 +64,7 @@ class WikipediaSearchViewController: ViewController {
resultsTableView.delegate = nil
resultsTableView.dataSource = nil
searchBar.rx_text
searchBar.rx.text
.asDriver()
.throttle(0.3)
.distinctUntilChanged()
@ -78,7 +78,7 @@ class WikipediaSearchViewController: ViewController {
.map { results in
results.map(SearchResultViewModel.init)
}
.drive(resultsTableView.rx_items(cellIdentifier: "WikipediaSearchCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
.drive(resultsTableView.rx.items(cellIdentifier: "WikipediaSearchCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
cell.viewModel = viewModel
}
.addDisposableTo(disposeBag)
@ -88,7 +88,7 @@ class WikipediaSearchViewController: ViewController {
let searchBar = self.searchBar
let searchController = self.searchController
resultsTableView.rx_contentOffset
resultsTableView.rx.contentOffset
.asDriver()
.filter { _ -> Bool in
return !searchController.isBeingPresented
@ -104,7 +104,7 @@ class WikipediaSearchViewController: ViewController {
func configureNavigateOnRowClick() {
let wireframe = DefaultWireframe.sharedInstance
resultsTableView.rx_modelSelected(SearchResultViewModel.self)
resultsTableView.rx.modelSelected(SearchResultViewModel.self)
.asDriver()
.drive(onNext: { searchResult in
wireframe.open(url:searchResult.searchResult.URL)
@ -118,7 +118,7 @@ class WikipediaSearchViewController: ViewController {
DefaultImageService.sharedImageService.loadingImage
) { $0 || $1 }
.distinctUntilChanged()
.drive(UIApplication.shared.rx_networkActivityIndicatorVisible)
.drive(UIApplication.shared.rx.networkActivityIndicatorVisible)
.addDisposableTo(disposeBag)
}
}

View File

@ -33,9 +33,9 @@ class DefaultWikipediaAPI: WikipediaAPI {
private init() {}
private func rx_JSON(_ url: URL) -> Observable<AnyObject> {
private func JSON(_ url: URL) -> Observable<AnyObject> {
return $.URLSession
.rx_JSON(url)
.rx.JSON(url)
.trackActivity(loadingWikipediaData)
}
@ -45,7 +45,7 @@ class DefaultWikipediaAPI: WikipediaAPI {
let urlContent = "http://en.wikipedia.org/w/api.php?action=opensearch&search=\(escapedQuery)"
let url = URL(string: urlContent)!
return rx_JSON(url)
return JSON(url)
.observeOn($.backgroundWorkScheduler)
.map { json in
guard let json = json as? [AnyObject] else {
@ -64,7 +64,7 @@ class DefaultWikipediaAPI: WikipediaAPI {
return Observable.error(apiError("Can't create url"))
}
return rx_JSON(url)
return JSON(url)
.map { jsonResult in
guard let json = jsonResult as? NSDictionary else {
throw exampleError("Parsing error")

View File

@ -32,7 +32,7 @@ class GeolocationService {
return Observable.just(status)
}
return locationManager
.rx_didChangeAuthorizationStatus
.rx.didChangeAuthorizationStatus
.startWith(status)
}
.asDriver(onErrorJustReturn: CLAuthorizationStatus.notDetermined)
@ -45,7 +45,7 @@ class GeolocationService {
}
}
location = locationManager.rx_didUpdateLocations
location = locationManager.rx.didUpdateLocations
.asDriver(onErrorJustReturn: [])
.flatMap {
return $0.last.map(Driver.just) ?? Driver.empty()

View File

@ -74,7 +74,7 @@ class DefaultImageService: ImageService {
}
else {
// fetch from network
decodedImage = self.$.URLSession.rx_data(URLRequest(url: url))
decodedImage = self.$.URLSession.rx.data(URLRequest(url: url))
.do(onNext: { data in
self._imageDataCache.setObject(data as AnyObject, forKey: url as AnyObject)
})

View File

@ -14,20 +14,20 @@ import RxCocoa
#endif
import UIKit
extension UIImageView{
extension Reactive where Base: UIImageView{
var rxex_downloadableImage: AnyObserver<DownloadableImage>{
return self.rxex_downloadableImageAnimated(nil)
var downloadableImage: AnyObserver<DownloadableImage>{
return downloadableImageAnimated(nil)
}
func rxex_downloadableImageAnimated(_ transitionType:String?) -> AnyObserver<DownloadableImage> {
return UIBindingObserver(UIElement: self) { imageView, image in
func downloadableImageAnimated(_ transitionType:String?) -> AnyObserver<DownloadableImage> {
return UIBindingObserver(UIElement: base as UIImageView) { imageView, image in
for subview in imageView.subviews {
subview.removeFromSuperview()
}
switch image {
case .content(let image):
imageView.rx_image.onNext(image)
imageView.rx.image.onNext(image)
case .offlinePlaceholder:
let label = UILabel(frame: imageView.bounds)
label.textAlignment = .center

View File

@ -28,7 +28,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didUpdateLocations.subscribe(onNext: { l in
_ = manager.rx.didUpdateLocations.subscribe(onNext: { l in
location = l[0]
}, onCompleted: {
completed = true
@ -49,7 +49,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didFailWithError.subscribe(onNext: { e in
_ = manager.rx.didFailWithError.subscribe(onNext: { e in
error = e
}, onCompleted: {
completed = true
@ -71,7 +71,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
_ = manager.rx.didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
error = e
}, onCompleted: {
completed = true
@ -91,7 +91,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
_ = manager.rx.didFinishDeferredUpdatesWithError.subscribe(onNext: { e in
error = e
}, onCompleted: {
completed = true
@ -115,7 +115,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didPauseLocationUpdates.subscribe(onNext: { u in
_ = manager.rx.didPauseLocationUpdates.subscribe(onNext: { u in
updates = u
}, onCompleted: {
completed = true
@ -135,7 +135,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didResumeLocationUpdates.subscribe(onNext: { _ in
_ = manager.rx.didResumeLocationUpdates.subscribe(onNext: { _ in
updates = ()
}, onCompleted: {
completed = true
@ -157,7 +157,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didUpdateHeading.subscribe(onNext: { n in
_ = manager.rx.didUpdateHeading.subscribe(onNext: { n in
heading = n
}, onCompleted: {
completed = true
@ -179,7 +179,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didEnterRegion.subscribe(onNext: { n in
_ = manager.rx.didEnterRegion.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -201,7 +201,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didExitRegion.subscribe(onNext: { n in
_ = manager.rx.didExitRegion.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -227,7 +227,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didDetermineStateForRegion.subscribe(onNext: { n in
_ = manager.rx.didDetermineStateForRegion.subscribe(onNext: { n in
value = (n.state, n.region)
}, onCompleted: {
completed = true
@ -251,7 +251,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
_ = manager.rx.monitoringDidFailForRegionWithError.subscribe(onNext: { l in
region = l.region
error = l.error
}, onCompleted: {
@ -276,7 +276,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_monitoringDidFailForRegionWithError.subscribe(onNext: { l in
_ = manager.rx.monitoringDidFailForRegionWithError.subscribe(onNext: { l in
region = l.region
error = l.error
}, onCompleted: {
@ -300,7 +300,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didStartMonitoringForRegion.subscribe(onNext: { n in
_ = manager.rx.didStartMonitoringForRegion.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -332,7 +332,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didRangeBeaconsInRegion.subscribe(onNext: { n in
_ = manager.rx.didRangeBeaconsInRegion.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -359,7 +359,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_rangingBeaconsDidFailForRegionWithError.subscribe(onNext: { n in
_ = manager.rx.rangingBeaconsDidFailForRegionWithError.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -384,7 +384,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didVisit.subscribe(onNext: { n in
_ = manager.rx.didVisit.subscribe(onNext: { n in
value = n
}, onCompleted: {
completed = true
@ -413,7 +413,7 @@ extension CLLocationManagerTests {
autoreleasepool {
let manager = CLLocationManager()
_ = manager.rx_didChangeAuthorizationStatus.subscribe(onNext: { status in
_ = manager.rx.didChangeAuthorizationStatus.subscribe(onNext: { status in
authorizationStatus = status
}, onCompleted: {
completed = true

View File

@ -15,7 +15,7 @@ import XCTest
extension ControlTests {
func testTextField_TextCompletesOnDealloc() {
let createView: () -> NSTextField = { NSTextField(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, "a") { (view: NSTextField) in view.rx_text }
ensurePropertyDeallocated(createView, "a") { (view: NSTextField) in view.rx.text }
}
}
@ -23,13 +23,13 @@ extension ControlTests {
extension ControlTests {
func testControl_DelegateEventCompletesOnDealloc() {
let createView: () -> NSControl = { NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensureEventDeallocated(createView) { (view: NSControl) in view.rx_controlEvent }
ensureEventDeallocated(createView) { (view: NSControl) in view.rx.controlEvent }
}
func testControl_enabled_true() {
let control = NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
_ = Observable.just(true).bindTo(control.rx_enabled)
_ = Observable.just(true).bindTo(control.rx.enabled)
XCTAssertEqual(true, control.isEnabled)
}
@ -37,7 +37,7 @@ extension ControlTests {
func testControl_enabled_false() {
let control = NSControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
_ = Observable.just(false).bindTo(control.rx_enabled)
_ = Observable.just(false).bindTo(control.rx.enabled)
XCTAssertEqual(false, control.isEnabled)
}
@ -47,7 +47,7 @@ extension ControlTests {
extension ControlTests {
func testCollectionView_DelegateEventCompletesOnDealloc() {
let createView: () -> NSSlider = { NSSlider(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, 0.3) { (view: NSSlider) in view.rx_value }
ensurePropertyDeallocated(createView, 0.3) { (view: NSSlider) in view.rx.value }
}
}
@ -55,24 +55,24 @@ extension ControlTests {
extension ControlTests {
func testButton_DelegateEventCompletesOnDealloc() {
let createView: () -> NSButton = { NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensureEventDeallocated(createView) { (view: NSButton) in view.rx_tap }
ensureEventDeallocated(createView) { (view: NSButton) in view.rx.tap }
}
func testButton_StateCompletesOnDealloc() {
let createView: () -> NSButton = { NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, 0) { (view: NSButton) in view.rx_state }
ensurePropertyDeallocated(createView, 0) { (view: NSButton) in view.rx.state }
}
func testButton_state_observer_on() {
let button = NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
_ = Observable.just(NSOnState).bindTo(button.rx_state)
_ = Observable.just(NSOnState).bindTo(button.rx.state)
XCTAssertEqual(button.state, NSOnState)
}
func testButton_state_observer_off() {
let button = NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
_ = Observable.just(NSOffState).bindTo(button.rx_state)
_ = Observable.just(NSOffState).bindTo(button.rx.state)
XCTAssertEqual(button.state, NSOffState)
}

View File

@ -14,7 +14,7 @@ import XCTest
extension ControlTests {
func testSubscribeEnabledToTrue() {
let subject = UIControl()
let disposable = Observable.just(true).subscribe(subject.rx_enabled)
let disposable = Observable.just(true).subscribe(subject.rx.enabled)
defer { disposable.dispose() }
XCTAssert(subject.isEnabled == true, "Expected enabled set to true")
@ -22,7 +22,7 @@ extension ControlTests {
func testSubscribeEnabledToFalse() {
let subject = UIControl()
let disposable = Observable.just(false).subscribe(subject.rx_enabled)
let disposable = Observable.just(false).subscribe(subject.rx.enabled)
defer { disposable.dispose() }
XCTAssert(subject.isEnabled == false, "Expected enabled set to false")
@ -30,7 +30,7 @@ extension ControlTests {
func testSubscribedSelectedToTrue() {
let subject = UIControl()
let disposable = Observable.just(true).subscribe(subject.rx_selected)
let disposable = Observable.just(true).subscribe(subject.rx.selected)
defer { disposable.dispose() }
XCTAssert(subject.isSelected == true, "Expected selected set to true")
@ -38,7 +38,7 @@ extension ControlTests {
func testSubscribeSelectedToFalse() {
let subject = UIControl()
let disposable = Observable.just(false).subscribe(subject.rx_selected)
let disposable = Observable.just(false).subscribe(subject.rx.selected)
defer { disposable.dispose() }
XCTAssert(subject.isSelected == false, "Expected selected set to false")
@ -52,7 +52,7 @@ extension ControlTests {
// UIBarButtonItem
extension ControlTests {
func testBarButtonItem_DelegateEventCompletesOnDealloc() {
ensureEventDeallocated({ UIBarButtonItem() }) { (view: UIBarButtonItem) in view.rx_tap }
ensureEventDeallocated({ UIBarButtonItem() }) { (view: UIBarButtonItem) in view.rx.tap }
}
}
@ -60,13 +60,13 @@ extension ControlTests {
extension ControlTests {
func testLabel_HasWeakReference() {
let variable = Variable<NSAttributedString?>(nil)
ensureControlObserverHasWeakReference(UILabel(), { (label: UILabel) -> AnyObserver<NSAttributedString?> in label.rx_attributedText }, { variable.asObservable() })
ensureControlObserverHasWeakReference(UILabel(), { (label: UILabel) -> AnyObserver<NSAttributedString?> in label.rx.attributedText }, { variable.asObservable() })
}
func testLabel_NextElementsSetsValue() {
let subject = UILabel()
let attributedTextSequence = Variable<NSAttributedString?>(nil)
let disposable = attributedTextSequence.asObservable().bindTo(subject.rx_attributedText)
let disposable = attributedTextSequence.asObservable().bindTo(subject.rx.attributedText)
defer { disposable.dispose() }
attributedTextSequence.value = NSAttributedString(string: "Hello!")
@ -77,13 +77,13 @@ extension ControlTests {
// UIProgressView
extension ControlTests {
func testProgressView_HasWeakReference() {
ensureControlObserverHasWeakReference(UIProgressView(), { (progressView: UIProgressView) -> AnyObserver<Float> in progressView.rx_progress }, { Variable<Float>(0.0).asObservable() })
ensureControlObserverHasWeakReference(UIProgressView(), { (progressView: UIProgressView) -> AnyObserver<Float> in progressView.rx.progress }, { Variable<Float>(0.0).asObservable() })
}
func testProgressView_NextElementsSetsValue() {
let subject = UIProgressView()
let progressSequence = Variable<Float>(0.0)
let disposable = progressSequence.asObservable().bindTo(subject.rx_progress)
let disposable = progressSequence.asObservable().bindTo(subject.rx.progress)
defer { disposable.dispose() }
progressSequence.value = 1.0
@ -95,7 +95,7 @@ extension ControlTests {
extension ControlTests {
func testControl_DelegateEventCompletesOnDealloc() {
let createView: () -> UIControl = { UIControl(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensureEventDeallocated(createView) { (view: UIControl) in view.rx_controlEvent(.allEditingEvents) }
ensureEventDeallocated(createView) { (view: UIControl) in view.rx.controlEvent(.allEditingEvents) }
}
}
@ -103,7 +103,7 @@ extension ControlTests {
extension ControlTests {
func testGestureRecognizer_DelegateEventCompletesOnDealloc() {
let createView: () -> UIGestureRecognizer = { UIGestureRecognizer(target: nil, action: NSSelectorFromString("s")) }
ensureEventDeallocated(createView) { (view: UIGestureRecognizer) in view.rx_event }
ensureEventDeallocated(createView) { (view: UIGestureRecognizer) in view.rx.event }
}
}
@ -111,7 +111,7 @@ extension ControlTests {
extension ControlTests {
func testScrollView_DelegateEventCompletesOnDealloc() {
let createView: () -> UIScrollView = { UIScrollView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx_contentOffset }
ensurePropertyDeallocated(createView, CGPoint(x: 1, y: 1)) { (view: UIScrollView) in view.rx.contentOffset }
}
}
@ -119,21 +119,21 @@ extension ControlTests {
extension ControlTests {
func testSegmentedControl_DelegateEventCompletesOnDealloc() {
let createView: () -> UISegmentedControl = { UISegmentedControl(items: ["a", "b", "c"]) }
ensurePropertyDeallocated(createView, 1) { (view: UISegmentedControl) in view.rx_value }
ensurePropertyDeallocated(createView, 1) { (view: UISegmentedControl) in view.rx.value }
}
}
// UIActivityIndicatorView
extension ControlTests {
func testActivityIndicator_HasWeakReference() {
ensureControlObserverHasWeakReference(UIActivityIndicatorView(), { (view: UIActivityIndicatorView) -> AnyObserver<Bool> in view.rx_animating }, { Variable<Bool>(true).asObservable() })
ensureControlObserverHasWeakReference(UIActivityIndicatorView(), { (view: UIActivityIndicatorView) -> AnyObserver<Bool> in view.rx.animating }, { Variable<Bool>(true).asObservable() })
}
func testActivityIndicator_NextElementsSetsValue() {
let subject = UIActivityIndicatorView()
let boolSequence = Variable<Bool>(false)
let disposable = boolSequence.asObservable().bindTo(subject.rx_animating)
let disposable = boolSequence.asObservable().bindTo(subject.rx.animating)
defer { disposable.dispose() }
boolSequence.value = true
@ -148,14 +148,14 @@ extension ControlTests {
extension ControlTests {
func testAlertAction_Enable() {
let subject = UIAlertAction()
Observable.just(false).subscribe(subject.rx_enabled).dispose()
Observable.just(false).subscribe(subject.rx.enabled).dispose()
XCTAssertTrue(subject.isEnabled == false)
}
func testAlertAction_Disable() {
let subject = UIAlertAction()
Observable.just(true).subscribe(subject.rx_enabled).dispose()
Observable.just(true).subscribe(subject.rx.enabled).dispose()
XCTAssertTrue(subject.isEnabled == true)
}
@ -167,7 +167,7 @@ extension ControlTests {
extension ControlTests {
func testDatePicker_DelegateEventCompletesOnDealloc() {
let createView: () -> UIDatePicker = { UIDatePicker(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, Date()) { (view: UIDatePicker) in view.rx_date }
ensurePropertyDeallocated(createView, Date()) { (view: UIDatePicker) in view.rx.date }
}
}
@ -176,7 +176,7 @@ extension ControlTests {
extension ControlTests {
func testSlider_DelegateEventCompletesOnDealloc() {
let createView: () -> UISlider = { UISlider(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, 0.5) { (view: UISlider) in view.rx_value }
ensurePropertyDeallocated(createView, 0.5) { (view: UISlider) in view.rx.value }
}
}
@ -184,7 +184,7 @@ extension ControlTests {
extension ControlTests {
func testStepper_DelegateEventCompletesOnDealloc() {
let createView: () -> UIStepper = { UIStepper(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, 1) { (view: UIStepper) in view.rx_value }
ensurePropertyDeallocated(createView, 1) { (view: UIStepper) in view.rx.value }
}
}
@ -195,7 +195,7 @@ extension ControlTests {
// TODO: UISwitch doesn't dealloc on Swift 2.3 compiler
func testSwitch_DelegateEventCompletesOnDealloc() {
let createView: () -> UISwitch = { UISwitch(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensurePropertyDeallocated(createView, true) { (view: UISwitch) in view.rx_value }
ensurePropertyDeallocated(createView, true) { (view: UISwitch) in view.rx.value }
}
#endif
}
@ -204,7 +204,7 @@ extension ControlTests {
extension ControlTests {
func testButton_tapDeallocates() {
let createView: () -> UIButton = { UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensureEventDeallocated(createView) { (view: UIButton) in view.rx_tap }
ensureEventDeallocated(createView) { (view: UIButton) in view.rx.tap }
}
}
@ -214,7 +214,7 @@ extension ControlTests {
extension ControlTests {
func testButton_tapDeallocates() {
let createView: () -> UIButton = { UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) }
ensureEventDeallocated(createView) { (view: UIButton) in view.rx_primaryAction }
ensureEventDeallocated(createView) { (view: UIButton) in view.rx.primaryAction }
}
}

View File

@ -43,7 +43,7 @@ class ExtendNSTextFieldDelegateProxy
class NSTextFieldSubclass
: NSTextField
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxTextFieldDelegateProxy {
override func createRxDelegateProxy() -> RxTextFieldDelegateProxy {
return ExtendNSTextFieldDelegateProxy(parentObject: self)
}
@ -52,7 +52,7 @@ class NSTextFieldSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(NSTextFieldDelegateSubclass.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}

View File

@ -149,7 +149,7 @@ class ExtendTableViewDelegateProxy
class UITableViewSubclass1
: UITableView
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return ExtendTableViewDelegateProxy(parentObject: self)
}
@ -158,7 +158,7 @@ class UITableViewSubclass1
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -182,7 +182,7 @@ class ExtendTableViewDataSourceProxy
class UITableViewSubclass2
: UITableView
, TestDelegateControl {
override func rx_createDataSourceProxy() -> RxTableViewDataSourceProxy {
override func createRxDataSourceProxy() -> RxTableViewDataSourceProxy {
return ExtendTableViewDataSourceProxy(parentObject: self)
}
@ -191,7 +191,7 @@ class UITableViewSubclass2
}
var test: Observable<Int> {
return rx_dataSource
return rx.dataSource
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -215,7 +215,7 @@ class ExtendCollectionViewDelegateProxy
class UICollectionViewSubclass1
: UICollectionView
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return ExtendCollectionViewDelegateProxy(parentObject: self)
}
@ -224,7 +224,7 @@ class UICollectionViewSubclass1
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -248,7 +248,7 @@ class ExtendCollectionViewDataSourceProxy
class UICollectionViewSubclass2
: UICollectionView
, TestDelegateControl {
override func rx_createDataSourceProxy() -> RxCollectionViewDataSourceProxy {
override func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy {
return ExtendCollectionViewDataSourceProxy(parentObject: self)
}
@ -257,7 +257,7 @@ class UICollectionViewSubclass2
}
var test: Observable<Int> {
return rx_dataSource
return rx.dataSource
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -281,7 +281,7 @@ class ExtendScrollViewDelegateProxy
class UIScrollViewSubclass
: UIScrollView
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return ExtendScrollViewDelegateProxy(parentObject: self)
}
@ -290,7 +290,7 @@ class UIScrollViewSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -316,7 +316,7 @@ class UISearchBarSubclass
: UISearchBar
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxSearchBarDelegateProxy {
override func createRxDelegateProxy() -> RxSearchBarDelegateProxy {
return ExtendSearchBarDelegateProxy(parentObject: self)
}
@ -325,7 +325,7 @@ class UISearchBarSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -350,7 +350,7 @@ class ExtendTextViewDelegateProxy
class UITextViewSubclass
: UITextView
, TestDelegateControl {
override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {
override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return ExtendTextViewDelegateProxy(parentObject: self)
}
@ -359,7 +359,7 @@ class UITextViewSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -378,7 +378,7 @@ class UISearchControllerSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}
@ -397,7 +397,7 @@ class UIPickerViewSubclass
}
var test: Observable<Int> {
return rx_delegate
return rx.delegate
.observe(#selector(TestDelegateProtocol.testEventHappened(_:)))
.map { a in (a[0] as! NSNumber).intValue }
}

View File

@ -48,10 +48,10 @@ class DelegateProxyTest : RxTest {
view.delegate = mock
let _ = view.rx_proxy
let _ = view.rx.proxy
XCTAssertEqual(mock.messages, [])
XCTAssertTrue(view.rx_proxy.forwardToDelegate() === mock)
XCTAssertTrue(view.rx.proxy.forwardToDelegate() === mock)
}
func test_forwardsUnobservedMethods() {
@ -60,7 +60,7 @@ class DelegateProxyTest : RxTest {
view.delegate = mock
let _ = view.rx_proxy
let _ = view.rx.proxy
view.delegate?.threeDView?(view, didLearnSomething: "Psssst ...")
@ -75,7 +75,7 @@ class DelegateProxyTest : RxTest {
var observedFeedRequest = false
let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
.subscribe(onNext: { n in
observedFeedRequest = true
})
@ -98,7 +98,7 @@ class DelegateProxyTest : RxTest {
var nMessages = 0
let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didLearnSomething:)))
.subscribe(onNext: { n in
nMessages += 1
})
@ -136,7 +136,7 @@ class DelegateProxyTest : RxTest {
var receivedArgument: IndexPath? = nil
let d = view.rx_proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
let d = view.rx.proxy.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
.subscribe(onNext: { n in
let ip = n[1] as! IndexPath
receivedArgument = ip
@ -165,7 +165,7 @@ class DelegateProxyTest : RxTest {
let sentArgument = IndexPath(index: 0)
_ = view
.rx_proxy
.rx.proxy
.observe(#selector(ThreeDSectionedViewProtocol.threeDView(_:didGetXXX:)))
.subscribe(onCompleted: {
completed = true
@ -183,7 +183,7 @@ class DelegateProxyTest : RxTest {
extension DelegateProxyTest {
func test_DelegateProxyHierarchyWorks() {
let tableView = UITableView()
_ = tableView.rx_delegate.observe(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:)))
_ = tableView.rx.delegate.observe(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:)))
}
}
#endif
@ -209,7 +209,7 @@ extension DelegateProxyTest {
completed = true
})
_ = (control as! NSObject).rx_deallocated.subscribe(onNext: { _ in
_ = (control as! NSObject).rx.deallocated.subscribe(onNext: { _ in
deallocated = true
})
}
@ -302,9 +302,9 @@ class ThreeDSectionedViewDelegateProxy : DelegateProxy
}
}
extension ThreeDSectionedView {
var rx_proxy: DelegateProxy {
return ThreeDSectionedViewDelegateProxy.proxyForObject(self)
extension Reactive where Base: ThreeDSectionedView {
var proxy: DelegateProxy {
return ThreeDSectionedViewDelegateProxy.proxyForObject(base)
}
}

View File

@ -32,7 +32,7 @@ class Parent : NSObject {
init(callback: @escaping (String?) -> Void) {
super.init()
self.rx_observe(String.self, "val", options: [.initial, .new], retainSelf: false)
self.rx.observe(String.self, "val", options: [.initial, .new], retainSelf: false)
.subscribe(onNext: callback)
.addDisposableTo(disposeBag)
}
@ -47,7 +47,7 @@ class Child : NSObject {
init(parent: ParentWithChild, callback: @escaping (String?) -> Void) {
super.init()
parent.rx_observe(String.self, "val", options: [.initial, .new], retainSelf: false)
parent.rx.observe(String.self, "val", options: [.initial, .new], retainSelf: false)
.subscribe(onNext: callback)
.addDisposableTo(disposeBag)
}
@ -140,7 +140,7 @@ extension KVOObservableTests {
func test_New() {
let testClass = TestClass()
let os = testClass.rx_observe(String.self, "pr", options: .new)
let os = testClass.rx.observe(String.self, "pr", options: .new)
var latest: String?
@ -174,7 +174,7 @@ extension KVOObservableTests {
func test_New_And_Initial() {
let testClass = TestClass()
let os = testClass.rx_observe(String.self, "pr", options: NSKeyValueObservingOptions(rawValue: NSKeyValueObservingOptions.initial.rawValue | NSKeyValueObservingOptions.new.rawValue))
let os = testClass.rx.observe(String.self, "pr", options: NSKeyValueObservingOptions(rawValue: NSKeyValueObservingOptions.initial.rawValue | NSKeyValueObservingOptions.new.rawValue))
var latest: String?
@ -208,7 +208,7 @@ extension KVOObservableTests {
func test_Default() {
let testClass = TestClass()
let os = testClass.rx_observe(String.self, "pr")
let os = testClass.rx.observe(String.self, "pr")
var latest: String?
@ -247,11 +247,11 @@ extension KVOObservableTests {
latest = n
}
_ = parent.rx_deallocated
_ = parent.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == "")
XCTAssertTrue(isDisposed == false)
@ -274,11 +274,11 @@ extension KVOObservableTests {
latest = n
}
_ = parent.rx_deallocated
_ = parent.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == "")
XCTAssertTrue(isDisposed == false)
@ -305,16 +305,16 @@ extension KVOObservableTests {
var root: HasStrongProperty! = HasStrongProperty()
_ = root.rx_observeWeakly(String.self, "property")
_ = root.rx.observeWeakly(String.self, "property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == nil)
XCTAssertTrue(!isDisposed)
@ -335,16 +335,16 @@ extension KVOObservableTests {
var root: HasWeakProperty! = HasWeakProperty()
_ = root.rx_observeWeakly(String.self, "property")
_ = root.rx.observeWeakly(String.self, "property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == nil)
XCTAssertTrue(!isDisposed)
@ -369,16 +369,16 @@ extension KVOObservableTests {
var root: HasWeakProperty! = HasWeakProperty()
_ = root.rx_observeWeakly(String.self, "property.property")
_ = root.rx.observeWeakly(String.self, "property.property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == nil)
XCTAssertTrue(isDisposed == false)
@ -418,16 +418,16 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
XCTAssertTrue(isDisposed == false)
_ = root.rx_observeWeakly(String.self, "property.property")
_ = root.rx.observeWeakly(String.self, "property.property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == "1")
XCTAssertTrue(isDisposed == false)
@ -446,16 +446,16 @@ extension KVOObservableTests {
var root: HasStrongProperty! = HasStrongProperty()
_ = root.rx_observeWeakly(String.self, "property.property")
_ = root.rx.observeWeakly(String.self, "property.property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == nil)
XCTAssertTrue(isDisposed == false)
@ -495,16 +495,16 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
XCTAssertTrue(isDisposed == false)
_ = root.rx_observeWeakly(String.self, "property.property")
_ = root.rx.observeWeakly(String.self, "property.property")
.subscribe(onNext: { n in
latest = n
})
_ = root.rx_deallocated
_ = root.rx.deallocated
.subscribe(onCompleted: {
isDisposed = true
})
XCTAssertTrue(latest == "1")
XCTAssertTrue(isDisposed == false)
@ -534,7 +534,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let observable = root.rx_observeWeakly(NSObject.self, "property.property")
let observable = root.rx.observeWeakly(NSObject.self, "property.property")
_ = observable
.subscribe(onNext: { n in
latest = n
@ -542,7 +542,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest! === one)
dealloc = one.rx_deallocating
dealloc = one.rx.deallocating
one = nil
}
@ -577,7 +577,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let observable = root.rx_observeWeakly(NSObject.self, "property.property.property")
let observable = root.rx.observeWeakly(NSObject.self, "property.property.property")
_ = observable
.subscribe(onNext: { n in
latest = n
@ -591,7 +591,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest === one)
dealloc = middle.rx_deallocating
dealloc = middle.rx.deallocating
}
return (root!, latest, dealloc)
}
@ -621,7 +621,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(String.self, "property")
.rx.observeWeakly(String.self, "property")
.subscribe(onNext: { n in
latest = n
})
@ -631,7 +631,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -652,7 +652,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(String.self, "property", options: .new)
.rx.observeWeakly(String.self, "property", options: .new)
.subscribe(onNext: { n in
latest = n
})
@ -666,7 +666,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -686,7 +686,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(NSRect.self, "frame")
let disposable = root.rx.observe(NSRect.self, "frame")
.subscribe(onNext: { n in
latest = n
})
@ -699,7 +699,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -722,7 +722,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let d = root.rx_observe(CGSize.self, "frame")
let d = root.rx.observe(CGSize.self, "frame")
.subscribe(onNext: { n in
latest = n
})
@ -740,7 +740,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -758,7 +758,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let d = root.rx_observe(CGRect.self, "frame")
let d = root.rx.observe(CGRect.self, "frame")
.subscribe(onNext: { n in
latest = n
})
@ -776,7 +776,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -794,7 +794,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let d = root.rx_observe(CGSize.self, "size")
let d = root.rx.observe(CGSize.self, "size")
.subscribe(onNext: { n in
latest = n
})
@ -812,7 +812,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -830,7 +830,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let d = root.rx_observe(CGPoint.self, "point")
let d = root.rx.observe(CGPoint.self, "point")
.subscribe(onNext: { n in
latest = n
})
@ -847,7 +847,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -867,7 +867,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(CGRect.self, "frame")
.rx.observeWeakly(CGRect.self, "frame")
.subscribe(onNext: { n in
latest = n
})
@ -880,7 +880,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -899,7 +899,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(CGSize.self, "size")
.rx.observeWeakly(CGSize.self, "size")
.subscribe(onNext: { n in
latest = n
})
@ -912,7 +912,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -931,7 +931,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(CGPoint.self, "point")
.rx.observeWeakly(CGPoint.self, "point")
.subscribe(onNext: { n in
latest = n
})
@ -945,7 +945,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -964,7 +964,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(NSNumber.self, "integer")
.rx.observeWeakly(NSNumber.self, "integer")
.subscribe(onNext: { n in
latest = n?.intValue
})
@ -977,7 +977,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -993,7 +993,7 @@ extension KVOObservableTests {
var lastError: Swift.Error? = nil
_ = root.rx_observeWeakly(NSNumber.self, "notExist")
_ = root.rx.observeWeakly(NSNumber.self, "notExist")
.subscribe(onError: { error in
lastError = error
})
@ -1004,7 +1004,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1019,7 +1019,7 @@ extension KVOObservableTests {
var lastError: Swift.Error? = nil
_ = root.rx_observeWeakly(NSNumber.self, "property.notExist")
_ = root.rx.observeWeakly(NSNumber.self, "property.notExist")
.subscribe(onError: { error in
lastError = error
})
@ -1033,7 +1033,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1055,7 +1055,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(Int.self, "integer")
let disposable = root.rx.observe(Int.self, "integer")
.subscribe(onNext: { n in
latest = n
})
@ -1068,7 +1068,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1088,7 +1088,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(UInt.self, "uinteger")
let disposable = root.rx.observe(UInt.self, "uinteger")
.subscribe(onNext: { n in
latest = n
})
@ -1101,7 +1101,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1125,7 +1125,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(Int.self, "integer")
.rx.observeWeakly(Int.self, "integer")
.subscribe(onNext: { n in
latest = n
})
@ -1139,7 +1139,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1158,7 +1158,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(UInt.self, "uinteger")
.rx.observeWeakly(UInt.self, "uinteger")
.subscribe(onNext: { n in
latest = n
})
@ -1172,7 +1172,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1194,7 +1194,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(IntEnum.self, "intEnum")
let disposable = root.rx.observe(IntEnum.self, "intEnum")
.subscribe(onNext: { n in
latest = n
})
@ -1207,7 +1207,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1227,7 +1227,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(Int32Enum.self, "int32Enum")
let disposable = root.rx.observe(Int32Enum.self, "int32Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1240,7 +1240,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1260,7 +1260,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(Int64Enum.self, "int64Enum")
let disposable = root.rx.observe(Int64Enum.self, "int64Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1273,7 +1273,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1294,7 +1294,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(UIntEnum.self, "uintEnum")
let disposable = root.rx.observe(UIntEnum.self, "uintEnum")
.subscribe(onNext: { n in
latest = n
})
@ -1307,7 +1307,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1327,7 +1327,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(UInt32Enum.self, "uint32Enum")
let disposable = root.rx.observe(UInt32Enum.self, "uint32Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1340,7 +1340,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1360,7 +1360,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
let disposable = root.rx_observe(UInt64Enum.self, "uint64Enum")
let disposable = root.rx.observe(UInt64Enum.self, "uint64Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1373,7 +1373,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1397,7 +1397,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(IntEnum.self, "intEnum")
.rx.observeWeakly(IntEnum.self, "intEnum")
.subscribe(onNext: { n in
latest = n
})
@ -1410,7 +1410,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1429,7 +1429,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(Int32Enum.self, "int32Enum")
.rx.observeWeakly(Int32Enum.self, "int32Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1442,7 +1442,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1461,7 +1461,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(Int64Enum.self, "int64Enum")
.rx.observeWeakly(Int64Enum.self, "int64Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1474,7 +1474,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1493,7 +1493,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(UIntEnum.self, "uintEnum")
.rx.observeWeakly(UIntEnum.self, "uintEnum")
.subscribe(onNext: { n in
latest = n
})
@ -1506,7 +1506,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1525,7 +1525,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(UInt32Enum.self, "uint32Enum")
.rx.observeWeakly(UInt32Enum.self, "uint32Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1538,7 +1538,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})
@ -1557,7 +1557,7 @@ extension KVOObservableTests {
XCTAssertTrue(latest == nil)
_ = root
.rx_observeWeakly(UInt32Enum.self, "uint64Enum")
.rx.observeWeakly(UInt32Enum.self, "uint64Enum")
.subscribe(onNext: { n in
latest = n
})
@ -1570,7 +1570,7 @@ extension KVOObservableTests {
var rootDeallocated = false
_ = root
.rx_deallocated
.rx.deallocated
.subscribe(onCompleted: {
rootDeallocated = true
})

Some files were not shown because too many files have changed in this diff Show More