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:
commit
9ce054936d
|
|
@ -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)> {}
|
||||
|
||||
}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:)))
|
||||
...
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 { }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
|||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 {
|
|||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]) )
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 () }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)")
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
// }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)")
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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])?")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue