Compare commits

..

243 Commits

Author SHA1 Message Date
Stanislav Kaluzhnyi 8b07d0cbde Collection view's reload data has been changed to reload sections 2016-09-07 17:22:52 +04:00
Krunoslav Zaher 2969fbe70d Fixes for issue template. 2016-08-27 12:45:03 +02:00
Krunoslav Zaher 6ed8c6c00d Updates issue template. 2016-08-27 12:41:04 +02:00
Krunoslav Zaher de28113c06 Updates README.md with Swift 2.3 version. 2016-08-27 12:33:10 +02:00
Krunoslav Zaher 08501da396 Merge pull request #848 from damianesteban/fix/readme-carthage-directions
Fix carthage directions in readme
2016-08-25 18:16:48 +02:00
Damian Esteban e85b3203bc Fix carthage directions in readme 2016-08-25 12:08:43 -04:00
Krunoslav Zaher 900035d78b Fixes deprecated warnings. 2016-08-21 19:26:15 +02:00
Krunoslav Zaher ef71ba9f20 Updates requirements section in README.md 2016-08-21 18:45:44 +02:00
Krunoslav Zaher 72122e3e43 Updates documentation for 3.0.0.alpha.1 2016-08-21 18:40:08 +02:00
Krunoslav Zaher 87b792e54d Adds 3.0.0.alpha.1 changes to CHANGELOG. 2016-08-21 17:17:35 +02:00
Krunoslav Zaher 8cebcd786f Excludes table and collection view deprecated APIs from watchOS. 2016-08-21 15:20:57 +02:00
Krunoslav Zaher 7208a8d1cc Improves deprecation messages for table and collection views. #841 2016-08-21 15:09:14 +02:00
Krunoslav Zaher e1f72cb566 Improves version detection. 2016-08-21 03:49:56 +02:00
Krunoslav Zaher 154ac2583d Release 3.0.0.alpha.1 2016-08-21 03:44:23 +02:00
Krunoslav Zaher 136322ab6a Moves OSX example app to top of validate script. 2016-08-21 03:41:44 +02:00
Krunoslav Zaher 24c4587b51 Fixes playgrounds. 2016-08-21 03:27:07 +02:00
Krunoslav Zaher 22219781a5 Adds skip UI tests flag. 2016-08-21 02:09:40 +02:00
Krunoslav Zaher 48bb9fcba5 Adds skip automation flags. 2016-08-21 02:06:40 +02:00
Krunoslav Zaher 7f43e1eecd Temporary disables example failing tests. ¯\_(ツ)_/¯ 2016-08-21 00:24:15 +02:00
Krunoslav Zaher f8d8c45f10 Sprinkles of workarounds for Apple bugs. 2016-08-20 23:25:49 +02:00
Krunoslav Zaher 92d4bdf5e1 Changes order of pre-release tests. 2016-08-20 23:06:30 +02:00
Krunoslav Zaher ff6e4fd651 Removes old automation tests. 2016-08-20 23:02:59 +02:00
Krunoslav Zaher b68fc4260e Adds UITests. 2016-08-20 22:59:34 +02:00
Krunoslav Zaher c9742e51b6 Removes Float80 extensions. 2016-08-20 03:13:41 +02:00
Krunoslav Zaher 1f363cea2e Updates project signing. 2016-08-20 03:12:59 +02:00
Krunoslav Zaher 83f3323ed8 Sets validation to use custom CocoaPods build. 2016-08-20 02:58:18 +02:00
Krunoslav Zaher 278c681753 Fixes UICollectionView deprecation warning. 2016-08-19 15:57:46 +02:00
Krunoslav Zaher 9b1f22e6a0 Fixes deprecated rename for `NopDisposable`. 2016-08-19 15:34:22 +02:00
Krunoslav Zaher 9473953b65 Fixes compilation issues with RxExample-iOS tests. 2016-08-19 02:05:41 +02:00
Krunoslav Zaher 1998e54085 Fixes RxCocoa compilation issues. 2016-08-19 01:59:06 +02:00
Krunoslav Zaher 94d6c01e3b Enables testability. 2016-08-19 01:49:57 +02:00
Krunoslav Zaher a4f15128bf Deprecates `RxTextInput` in favor of `TextInput`. 2016-08-19 01:46:27 +02:00
Krunoslav Zaher 5610073ca9 Adds comments to `Reactive`. 2016-08-19 01:46:09 +02:00
Krunoslav Zaher 9ce054936d Merge branch 'swift-3.0-removing-rx_-prefix' of https://github.com/JegnuX/RxSwift into JegnuX-swift-3.0-removing-rx_-prefix 2016-08-19 00:45:51 +02:00
Krunoslav Zaher 4bd842301b Merge pull request #835 from mohsenr/xcode8-beta6
[Swift 3.0] Fixes for Xcode8 beta6
2016-08-18 00:14:51 +02:00
Mo Ramezanpoor 0fe4c9a792 Fixes RxExample. 2016-08-17 09:49:29 +01:00
Mo Ramezanpoor b9b593d740 Adds a nullability annotation to `_RXDelegateProxy`.
`AllTests` now passes.
2016-08-17 09:28:56 +01:00
Krunoslav Zaher 6763f1a4b7 Replaces `open` with `public`. 2016-08-16 22:10:41 +02:00
Mo Ramezanpoor d43e717415 WIP: AllTests compiles. 2016-08-16 16:09:08 +01:00
Mo Ramezanpoor 819635d9aa Fixes RxTests. 2016-08-16 15:36:44 +01:00
Mo Ramezanpoor b0026d65eb Fixes RxCocoa for macOS. 2016-08-16 15:36:20 +01:00
Mo Ramezanpoor 695ea19e02 WIP: Fixes warnings in RxCocoa. 2016-08-16 15:31:51 +01:00
Mo Ramezanpoor e55c6675f4 Removes the KVOCallback type alias.
The compiler wouldn’t recognise that it should be imported as escaping.
2016-08-16 15:13:47 +01:00
Mo Ramezanpoor 301ad9f438 WIP: Fix a bunch of RxCocoa compilation issues. 2016-08-16 15:01:07 +01:00
Mo Ramezanpoor 047c77a698 WIP: Removes a call to `unsafeAddress(of:)`. 2016-08-16 14:28:35 +01:00
Mo Ramezanpoor a2be331fee WIP: Fixes signature of `ReplaySubject.create()`. 2016-08-16 14:25:57 +01:00
Mo Ramezanpoor 2d36297601 WIP: Marks escaping closures as such. 2016-08-16 14:25:15 +01:00
Mo Ramezanpoor c12b315149 WIP: Fixes private access issues. 2016-08-16 14:25:01 +01:00
Mo Ramezanpoor 74464a4940 WIP: Clarifies references to `Swift.Never`. 2016-08-16 14:01:52 +01:00
Mo Ramezanpoor fcf8e4d092 WIP: Updates code for Xcode 8 beta 6 using the migrator with manual auditing.
The code doesn’t compile yet.
2016-08-16 14:00:14 +01:00
Jérôme Alves 43c0b952ec Remove `AnyObject` constraint and add a new protocol `ReactiveCompatible` to mark types which should be extended with the `rx` var. 2016-08-16 10:47:26 +02:00
Jérôme Alves 96ef70cc2f Update documentation (.md files) 2016-08-16 09:05:24 +02:00
Krunoslav Zaher 7adc86f7d2 Adds `onSubscribe` and `onDispose` for `do` operator. #583 2016-08-16 00:03:30 +02:00
Jérôme Alves cbb0ed5d29 Merge branch 'swift-3.0' into swift-3.0-removing-rx_-prefix 2016-08-15 19:19:22 +02:00
Krunoslav Zaher e2f4bad2bb Merge pull request #831 from JegnuX/swift-3.0-type-fix
[Swift 3.0] Fix ActivityToken dispose type.
2016-08-15 18:57:08 +02:00
Jérôme Alves 7f65914f93 Fix ActivityToken dispose type. 2016-08-15 17:53:13 +02:00
Jérôme Alves e59adc3ae9 Updates Unit Tests and makes them succeed. 2016-08-15 17:46:13 +02:00
Jérôme Alves e4e422c4f1 Merge branch 'swift-3.0' into swift-3.0-removing-rx_-prefix
Conflicts:
	RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift
	RxCocoa/OSX/NSImageView+Rx.swift
	RxCocoa/iOS/UICollectionView+Rx.swift
	RxCocoa/iOS/UIControl+Rx.swift
	RxCocoa/iOS/UIImageView+Rx.swift
	RxCocoa/iOS/UILabel+Rx.swift
	RxCocoa/iOS/UITableView+Rx.swift
	RxExample/RxDataSources/DataSources+Rx/UISectionedViewType+RxAnimatedDataSource.swift
	RxExample/RxExample/Examples/APIWrappers/APIWrappersViewController.swift
	RxExample/RxExample/Examples/GitHubSearchRepositories/GitHubSearchRepositoriesViewController.swift
	RxExample/RxExample/Examples/GitHubSignup/UsingDriver/GitHubSignupViewController2.swift
	RxExample/RxExample/Examples/GitHubSignup/UsingVanillaObservables/GitHubSignupViewController1.swift
	RxExample/RxExample/Examples/ImagePicker/UIImagePickerController+RxCreate.swift
	RxExample/RxExample/Examples/OSX simple example/IntroductionExampleViewController.swift
	RxExample/RxExample/Examples/SimpleTableViewExample/SimpleTableViewExampleViewController.swift
	RxExample/RxExample/Examples/SimpleTableViewExampleSectioned/SimpleTableViewExampleSectionedViewController.swift
	RxExample/RxExample/Examples/SimpleValidation/SimpleValidationViewController.swift
	RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift
	RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift
	RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchCell.swift
	RxExample/RxExample/Examples/WikipediaImageSearch/Views/WikipediaSearchViewController.swift
	Tests/RxCocoaTests/DelegateProxyTest.swift
	Tests/RxCocoaTests/KVOObservableTests.swift
	Tests/RxCocoaTests/RxTest+Controls.swift
	Tests/RxCocoaTests/UICollectionView+RxTests.swift
	Tests/RxCocoaTests/UIScrollView+RxTests.swift
	Tests/RxCocoaTests/UITableView+RxTests.swift
2016-08-15 12:17:26 +02:00
Krunoslav Zaher 4f54c9bf5a Merge branch 'swift-3.0' of github.com:kzaher/RxSwift into swift-3.0 2016-08-15 01:12:21 +02:00
Krunoslav Zaher 8b00921da7 Merge branch 'develop' into swift-3.0 2016-08-15 01:08:36 +02:00
Krunoslav Zaher bdbcb5bc87 Improves UITableView and UICollection view bindings behavior. 2016-08-14 23:25:54 +02:00
Krunoslav Zaher 55f4bb3b65 Merge pull request #828 from mohsenr/swift-3.0-disposables-rebased
[Swift 3.0] Collect all immutable Disposable constructors in `Disposables` type
2016-08-10 23:06:45 +02:00
Mo Ramezanpoor f1b4e0f6b7 Merge with 'swift-3.0' 2016-08-10 15:24:27 +01:00
Mo Ramezanpoor f8a11aa0cb Document `Disposables`. 2016-08-10 15:16:58 +01:00
Mo Ramezanpoor 8754166f35 Hides `Disposables.init()` internally by making it private. 2016-08-10 15:03:52 +01:00
Mo Ramezanpoor 75971c61c6 Replaces all calls to `AnonymousDisposable.init()` with `Disposables.create()`. 2016-08-10 15:00:29 +01:00
Mo Ramezanpoor c643d4c0b5 Returns `Cancelable` instead of `Disposable` from all overloads of `Disposables.create()` except for no-op (which is stateless). 2016-08-10 15:00:02 +01:00
Mo Ramezanpoor 64526c8dcd Replaces all calls to `StableCompositeDisposable.create()` with `Disposables.create()`. 2016-08-10 14:49:21 +01:00
Mo Ramezanpoor 1fe15bb9da Replaces all calls to `NopDisposable.instance` with `Disposables.create()`. 2016-08-10 14:47:53 +01:00
Mo Ramezanpoor a981d4caab Overloads `Disposables.create()` with a version accepting variadics after the third argument. 2016-08-10 14:43:51 +01:00
Mo Ramezanpoor 6d17e711ab Changes implementation of two overloads of `Disposables.create()` to avoid deprecation warnings. 2016-08-10 14:33:39 +01:00
Mo Ramezanpoor 341ef8fc3b Rename `Disposables.empty()` to `.create()`. 2016-08-10 14:28:13 +01:00
Mo Ramezanpoor 2812da1f5e Replace immutable initialisations of `CompositeDisposable` with `Disposables.create()`.
The factory methods will select specialised implementations based on the case.
2016-08-10 14:27:45 +01:00
Krunoslav Zaher 2498b3194d Merge pull request #829 from rhx/swift-3.0
Update for Xcode 8 beta 5
2016-08-10 15:04:12 +02:00
Rene Hexel 2e4b6990e8 Update for Xcode 8 beta 5 2016-08-10 09:45:23 +10:00
Krunoslav Zaher 6eda820476 Merge pull request #827 from mohsenr/swift-3.0-isDisposed
[Swift 3.0] Renames `disposed` to `isDisposed`
2016-08-09 21:34:53 +02:00
Mo Ramezanpoor 2df8c43077 Deprecates `StableCompositeDisposable.create()` in favour of `Disposables.create()`. 2016-08-09 10:45:29 +01:00
Mo Ramezanpoor ac876f35db Deprecates `AnonymousDisposable.init` in favour of `Disposables.create()`. 2016-08-09 10:34:43 +01:00
Mo Ramezanpoor 0058d2ff67 Deprecates `NopDisposable.instance` in favour of `Disposables.empty()`. 2016-08-09 10:32:35 +01:00
Mo Ramezanpoor 23ae9692e7 Change Disposables.empty from a property to a method to mirror `Observable.empty()`. 2016-08-09 10:30:18 +01:00
Mo Ramezanpoor eb646a97a6 Makes `BinaryDisposable` private.
Uses `Disposables.create()` instead.
2016-08-09 10:24:02 +01:00
Mo Ramezanpoor b0a819981b Implement `Cancelable.disposed` as an extension. 2016-08-09 10:12:55 +01:00
Mo Ramezanpoor d3eacdfcb5 BinaryDisposable is no longer public. 2016-08-09 10:05:49 +01:00
Mo Ramezanpoor dbc635d6e7 Create Disposables type. 2016-08-09 09:55:11 +01:00
Mo Ramezanpoor cb5d23c757 Removes defunct NAryDisposable.(swift|tt) files. 2016-08-09 09:54:39 +01:00
Mo Ramezanpoor 38e5a500c7 Makes some disposable classes marked as final. 2016-08-09 09:54:20 +01:00
Mo Ramezanpoor 6887745089 Renames `MySubject.diposed` (with a typo) to `.isDisposed`. 2016-08-09 09:50:36 +01:00
Mo Ramezanpoor e530858bd0 Renames `disposed` to `isDisposed` in any place that it makes semantically. 2016-08-09 09:50:13 +01:00
Jérôme Alves 10ff55cfba Moves RxCocoa extensions from `rx_` syntax to `rx.` syntax.
The main work is done in this commit but the feature it's still "work in progress"
2016-08-09 00:17:38 +02:00
Krunoslav Zaher 46286d3291 Bumps up podspec OSX minimal version to 10.10. #791 2016-08-07 20:27:31 +02:00
Krunoslav Zaher aef4e69339 Modernizes APIs. 2016-08-07 20:14:19 +02:00
Krunoslav Zaher 3637153169 Fixes warnings. 2016-08-07 18:59:36 +02:00
Krunoslav Zaher 8a58deaa2b Deprecates `toObservable` in favor of `from` operator. 2016-08-07 18:54:23 +02:00
Krunoslav Zaher 441a4a22db Modernizes doOn operator. 2016-08-07 18:24:33 +02:00
Krunoslav Zaher d1cde77b18 Modernizes image view extensions. 2016-08-07 18:08:13 +02:00
Krunoslav Zaher afd40f5d8b Modernizes UICollectionView extensions. 2016-08-07 16:48:25 +02:00
Krunoslav Zaher 1b0e0a3c88 Updates RxDataSources. 2016-08-07 16:12:16 +02:00
Krunoslav Zaher 10b0d39e05 Fixes warnings. 2016-08-07 16:04:47 +02:00
Krunoslav Zaher 091b12242a Merge branch 'master' into swift-3.0 2016-08-07 15:28:44 +02:00
Krunoslav Zaher 4b602fd88e Merge remote-tracking branch 'origin/master' into develop 2016-08-07 15:27:58 +02:00
Krunoslav Zaher 2f06600985 Merge pull request #823 from vburojevic/typos
Typo in Getting Started
2016-08-07 15:27:31 +02:00
Krunoslav Zaher 8e01b2ffe4 Merge pull request #820 from tqtifnypmb/master
Typo
2016-08-07 15:27:09 +02:00
Krunoslav Zaher 9c14b7fde1 Merge pull request #824 from ReactiveX/slack-channel-url
Update README.md
2016-08-07 15:26:59 +02:00
Krunoslav Zaher 03d6950bf1 Merge branch 'develop' into swift-3.0 2016-08-07 15:24:44 +02:00
Krunoslav Zaher 7b6a244f45 Fixes problem with data sources. 2016-08-07 15:23:17 +02:00
Krunoslav Zaher e2c3330d61 Fixes default datasources implementation. #825 2016-08-07 15:12:54 +02:00
Junior B 208a84db0f Update README.md 2016-08-07 01:33:37 +02:00
Vedran Burojević 0b1856d43e Fixes typo in Getting Started 2016-08-06 19:44:02 +02:00
Krunoslav Zaher 58e427b045 Fixes playgrounds compilation issues. 2016-08-04 11:53:19 +02:00
Krunoslav Zaher a2ee04e721 Fixes unit tests. 2016-08-04 11:12:53 +02:00
Krunoslav Zaher 38c45c066d Example compilation fixes. 2016-08-04 10:56:09 +02:00
Krunoslav Zaher 01d86ff684 Fixes OSX compilation issues. 2016-08-04 10:48:36 +02:00
Krunoslav Zaher 2ead37809e Fixes example app compiling. 2016-08-04 10:44:46 +02:00
LZL 72e5488631 Typo 2016-08-03 17:27:15 +08:00
Krunoslav Zaher 21a56a8ebd Fixes all tests. 2016-08-02 14:51:04 +02:00
Yuki Nagai a9d0cfeb5b Add Error extension instead of NSError for Workaround; NSError extension returns a type which conforms to Error protocol 2016-08-02 21:48:01 +09:00
Yuki Nagai 7f84ec604e WIP. Update for Xcode 8 beta 4. 2016-08-02 15:46:11 +09:00
Krunoslav Zaher bfb9441414 Merge pull request #812 from nishitaniyuki/fix-minor-typo
Fix minor typo
2016-08-01 11:47:28 +02:00
Krunoslav Zaher 3b34850675 Merge branch 'swift-3.0' of github.com:kzaher/RxSwift into swift-3.0 2016-08-01 10:47:06 +02:00
Krunoslav Zaher c844b6bdb3 Merge branch 'develop' into swift-3.0 2016-08-01 10:46:20 +02:00
Krunoslav Zaher dffd6f0e1c Moves playgrounds from workspace to project. #806 2016-08-01 10:27:18 +02:00
nishitani yuki 544e00d917 Fix minor typo 2016-08-01 13:52:57 +09:00
Krunoslav Zaher 490b6cbbc5 Merge pull request #790 from sunshinejr/swift-3.0
[Swift 3.0] Remove first parameter names for Observables.
2016-07-29 12:11:35 +02:00
Krunoslav Zaher b1c6673da7 Merge pull request #801 from mohsenr/swift-3.0-disposables
[Swift 3.0] Rename disposable-related methods (implements #800)
2016-07-28 23:49:17 +02:00
Krunoslav Zaher 372d766519 Merge pull request #809 from peagasilva/patch-1
Update Rx.playground/Pages/Introduction/Contents.swift
2016-07-28 23:46:24 +02:00
Raphael Silva 40eb452040 Update Contents.swift
Typo fixed - it was missing the `ed` in called.
2016-07-28 18:06:29 -03:00
Mo Ramezanpoor 99e21bdb46 Rename CompositeDisposable.removeDisposable(forKey:) to .remove(for:).
Decided as part of #800 that this is more suitable.
2016-07-27 16:34:38 +01:00
Krunoslav Zaher d12b8321d2 Merge pull request #804 from devxoul/tableview-willdisplaycell
Fix type mismatch in UITableView.rx_willDisplayCell
2016-07-27 16:00:19 +02:00
Suyeol Jeon f303efb077 Fix type mismatch in UITableView.rx_willDisplayCell 2016-07-27 04:15:17 +09:00
Łukasz Mróz 181a94bbc9 [Swift3] doOn syntax. 2016-07-25 20:39:01 +02:00
Mo Ramezanpoor fa14592a2b Rename disposeAllIn(_:) to disposeAll(in:).
Ideally we’d move this to be a method on Bag where T: Disposable. Unfortunately atm that doesn’t work on Bag<Disposable> itself, only on concrete types inheriting from it.

We can at least make the function feel more at home in Swift 3.
2016-07-25 16:04:32 +01:00
Mo Ramezanpoor 61420eef9f Add DisposeBag.insert() and deprecate DisposeBag.addDisposable().
Update [the only] known call site to match.
2016-07-25 15:37:33 +01:00
Mo Ramezanpoor fbee131886 Update all known call sites to use the new insert/remove methods on CompositeDisposable. 2016-07-25 15:31:40 +01:00
Mo Ramezanpoor 2cb931d8e9 Add new insert/remove methods to CompositeDisposable that follow Swift 3 naming conventions. 2016-07-25 15:30:54 +01:00
Krunoslav Zaher 0c8d28b1b6 Fixes disposing for debug operator in case of termination event. 2016-07-23 16:20:10 +02:00
Krunoslav Zaher 1301e9925a Fixes for Swift 3.0 2016-07-23 16:05:04 +02:00
Krunoslav Zaher 070907471c Fixes problem with schedulers introduced with Swift 3.0 and changes in libdispatch. #799 2016-07-23 14:14:08 +02:00
Krunoslav Zaher f3f2b0e083 Updates to Swift 3.0 2016-07-22 22:34:34 +02:00
Krunoslav Zaher e79457dcd3 Fixes for Xcode beta 3. 2016-07-20 22:14:59 +02:00
Krunoslav Zaher 824f23c94e Merge pull request #797 from noremac/swift-3.0
Adds further Xcode 8 beta 3 fixes.
2016-07-20 01:10:29 +02:00
Cameron Pulsford 5c908f18b8 Adds further Xcode 8 beta 3 fixes. 2016-07-19 18:42:18 -04:00
Krunoslav Zaher d4981303b5 Merge pull request #796 from noremac/swift-3.0
Updates project with Xcode 8 beta 3.
2016-07-20 00:04:17 +02:00
Cameron Pulsford 7c2f20cf36 Updates project with Xcode 8 beta 3. 2016-07-19 11:33:06 -04:00
Krunoslav Zaher cba021a961 Adds `swift-3.0` as valid branch in Dangerfile. 2016-07-11 01:36:22 +02:00
Krunoslav Zaher 9cac0cc234 Adaptations for Swift 3.0. 2016-07-10 14:55:18 +02:00
Krunoslav Zaher b47ce13eae Adds printing of environment info. 2016-07-10 13:06:00 +02:00
Krunoslav Zaher 1124f40ef1 Fixes Swift version. 2016-07-10 12:45:41 +02:00
Krunoslav Zaher 03fae9de6f Changes deployment target for example app. 2016-07-10 12:39:02 +02:00
Krunoslav Zaher 996caf6917 Fixes platform. 2016-07-10 12:33:55 +02:00
Krunoslav Zaher a1b34f0f50 Fixes unit tests warning. 2016-07-10 12:29:29 +02:00
Krunoslav Zaher 125deae0c8 Fixes tvOS compilation. 2016-07-10 12:23:50 +02:00
Krunoslav Zaher 8e46d377da Fixes concurrent dispatch queue scheduler initializer. 2016-07-10 12:18:11 +02:00
Krunoslav Zaher 348ce89e17 Fixes `rx_sentMessage` unit tests. 2016-07-10 11:33:51 +02:00
Krunoslav Zaher e222e52223 Deletes RxExample-iOS-no-module scheme. 2016-07-09 23:11:54 +02:00
Krunoslav Zaher edf423d42e Improves KVOObservable code. 2016-07-08 00:20:24 +02:00
Krunoslav Zaher e2edffc39d Fixes `@warn_unused_result(message: "http://git.io/rxs.ud")` warnings. 2016-07-08 00:04:44 +02:00
Krunoslav Zaher 6770c8a4c0 Fixes `.self` warnings. 2016-07-08 00:02:45 +02:00
Krunoslav Zaher bce8e9cd2d Fixes example app. 2016-07-07 23:50:38 +02:00
Krunoslav Zaher a64c07d1e1 Merge pull request #787 from sergdort/swift-3.0
Merged latest master
2016-07-07 23:22:57 +02:00
Krunoslav Zaher 7cc3dab5cb Merge pull request #789 from kciter/remove-meaningless-line
Remove typealias Parent line in Filter.swift
2016-07-07 21:50:39 +02:00
Lee Sun-Hyoup 6757b82872 Remove typealias Parent line in Filter.swift 2016-07-07 18:53:59 +09:00
sergdort d40557bbd7 Fixed test failing on `testObservingForAllTypes` 2016-07-07 10:29:04 +03:00
Krunoslav Zaher 987afd4a92 Merge pull request #786 from mohsenr/swift-3.0
Update for Xcode 8 beta 2.
2016-07-07 00:21:55 +02:00
Mo Ramezanpoor 14fa47c623 Update for Xcode 8 beta 2.
`Thread.current` is a class property, not a method.
2016-07-06 11:34:49 +01:00
sergdort 7e2a492895 Fixed the bug with determining property attributes in KVOObservable 2016-07-06 10:29:38 +03:00
sergdort b7cd7ba56c Fixes after merge conflicts 2016-07-05 18:07:18 +03:00
sergdort cfb8b1558a Merge branch 'master' into swift-3.0
Conflicts:
	RxExample/RxDataSources/DataSources/CollectionViewSectionedDataSource.swift
	RxExample/RxDataSources/DataSources/Differentiator.swift
	RxExample/RxDataSources/DataSources/TableViewSectionedDataSource.swift
	RxExample/RxExample.xcodeproj/project.pbxproj
	RxExample/RxExample.xcodeproj/xcshareddata/xcschemes/RxExample-iOS-no-module.xcscheme
	RxExample/RxExample/Examples/TableViewPartialUpdates/PartialUpdatesViewController.swift
	RxExample/RxExample/Examples/TableViewWithEditingCommands/TableViewWithEditingCommandsViewController.swift
	RxExample/RxExample/Services/HtmlParsing.swift
	Tests/RxCocoaTests/CLLocationManager+RxTests.swift
	Tests/RxCocoaTests/UICollectionView+RxTests.swift
2016-07-05 18:00:36 +03:00
Krunoslav Zaher 95ee9d0de8 Fixes problem with editing UITableView example. #768 2016-07-04 20:55:54 +02:00
Krunoslav Zaher ca831c7321 Updates README with a friendly information about Xcode 8.0 beta. 2016-07-04 07:16:33 +02:00
Krunoslav Zaher 56e09abb11 Fixes problem with Swift 2.3 2016-07-04 07:02:49 +02:00
Krunoslav Zaher 1633a4192e Disables bitcode for RxTests/tvOS because Carthage with Swift 2.3 and Xcode 8.0 fails to compile it. 2016-07-04 06:13:58 +02:00
Krunoslav Zaher f51151c3d2 Fixes RandomAPI response Parsing. 2016-07-04 04:25:21 +02:00
Krunoslav Zaher 2787393621 Fixes for Xcode 7.3.1 2016-07-04 04:06:01 +02:00
Krunoslav Zaher 5c0ce0a1c8 Xcode 8 beta, Swift 2.3 fixes. 2016-07-04 03:35:41 +02:00
Krunoslav Zaher bce72a2617 Fixes headers. 2016-07-04 02:54:32 +02:00
Krunoslav Zaher 68b5ae3e4c Xcode 8.0 fixes. 2016-07-04 02:48:41 +02:00
Krunoslav Zaher f86d12a53b Release 2.6.0 2016-07-04 02:27:30 +02:00
Krunoslav Zaher 88f718ffc3 Updates latest version of data sources. 2016-07-04 02:06:08 +02:00
Krunoslav Zaher e20ac5fbb7 Adds simple data source usage examples in inline docs. 2016-07-04 01:42:26 +02:00
Krunoslav Zaher 2d50bc135c Fixes compilation for Swift 2.3 compiler. 2016-07-04 01:07:19 +02:00
Krunoslav Zaher 17f8aac437 Removes unit tests failing because of accidentally included plist. 2016-07-04 01:03:13 +02:00
Krunoslav Zaher f95b1ed122 Unit tests, documents and improves data source/delegate interfaces. 2016-07-04 01:02:08 +02:00
Krunoslav Zaher 7e17ca9fde Updates mdast to remark. 2016-07-03 22:03:26 +02:00
Krunoslav Zaher 6b031f97bd Merge branch 'develop' of github.com:ReactiveX/RxSwift into develop 2016-07-03 16:37:32 +02:00
Krunoslav Zaher c0939e1b4e Removes RxExample-no-module scheme. 2016-07-03 16:05:46 +02:00
Krunoslav Zaher e3d2305a8f Fixes building playgrounds. 2016-07-03 13:03:47 +02:00
Krunoslav Zaher 5b95007fba Merge pull request #778 from sunshinejr/feature/equatable_recorded_public
[RxTests] Make equatable operator for Recorded public.
2016-07-03 13:03:09 +02:00
Krunoslav Zaher d1916b4a19 Merge pull request #779 from tomburns/fix-rxblocking
Fix RxBlocking in Swift 3
2016-07-03 13:00:57 +02:00
Tom Burns 98cf430382 Fix ConcurrentDispatchQueueSchd's schedulePeriodic
Fix interval conversion error (new API expects Double, not TimeInterval)
2016-07-02 19:58:29 -05:00
Tom Burns c33d5806fd Remove errant whitespace 2016-07-02 18:47:47 -05:00
Tom Burns 45b8b32b35 Fix RxBlocking in Swift 3
Remove force cast in favor of rawValue to fix crash at runtime
2016-07-02 18:45:08 -05:00
Łukasz Mróz 8989ea3a0a [RxTests] Make equatable Recorded public 2016-07-02 23:04:41 +02:00
Krunoslav Zaher ad96d6b0e1 Merge pull request #777 from baek-jinoo/minor-typo-fix
Minor typo fix
2016-07-01 10:42:21 +02:00
Krunoslav Zaher 5a9771e818 Removes no-module version. 2016-06-30 10:51:05 +02:00
Krunoslav Zaher 62bd1d5498 Fixes all-tests.sh 2016-06-30 10:49:07 +02:00
Krunoslav Zaher bbea37dcda Merge pull request #775 from DouglasHeriot/swift-2.3
Update for Xcode 8, Swift 2.3.
2016-06-30 10:47:47 +02:00
Krunoslav Zaher b72a2ce86d Merge pull request #776 from DouglasHeriot/swift-3.0
Make Travis use Xcode 8 for building Swift 3
2016-06-30 10:45:19 +02:00
Douglas Heriot 67160ee0dc Put Travis back to Xcode 7.3
Upgrading to 8 requires all .swift build scripts to use Swift 3, which isn't appropriate in this branch.
2016-06-30 00:41:14 +10:00
Douglas Heriot 76a63104fa Update Travis to use Xcode 8.
Also update validate-headers.swift for Swift 3.
2016-06-30 00:26:04 +10:00
Douglas Heriot 5a566ae183 Fix RxExample for Xcode 8, Swift 2.3 2016-06-29 22:54:12 +10:00
Krunoslav Zaher e730955869 Merge pull request #770 from tonyarnold/fix/static-analysis-issues
Resolve minor static analysis issues
2016-06-29 13:37:57 +02:00
Tony Arnold 1a289e97fd Add information about resolved static analysis issues in RxCocoa’s Objective-C classes to the changelog 2016-06-29 11:31:21 +10:00
Tony Arnold e4219c8423 Add RX_CATCH_ERROR macro to work around implicit nullable state of NSError parameters in Objective-C methods 2016-06-29 10:59:13 +10:00
Douglas Heriot d48dff3a4f Update for Xcode 8, Swift 2.3.
Bump OSX Deployment Target to 10.10 to avoid libarclite duplicate linking error?
2016-06-29 01:54:19 +10:00
Tony Arnold c50efe34c7 Initialise targetClass to NULL to silence a static analysis issue 2016-06-28 13:17:17 +10:00
Krunoslav Zaher 0815ea5c96 Merge pull request #767 from sora0077/feature/RXDelegateProxy_weak
Change _forwardToDelegate to weak reference
2016-06-27 17:21:24 +02:00
林達也 fc0fdb4850 Change _forwardToDelegate to weak reference 2016-06-27 23:31:38 +09:00
Krunoslav Zaher 7ec1ffc935 Merge branch 'sergdort-swift-3.0' into swift-3.0 2016-06-26 15:28:35 +02:00
Krunoslav Zaher 7089f6d7de Fixes .travis.yml 2016-06-26 15:03:24 +02:00
Krunoslav Zaher f72cc12b94 Improves CONTRIBUTING.md 2016-06-26 14:59:45 +02:00
Krunoslav Zaher 37560a734e Moves issue template to root. 2016-06-26 14:53:12 +02:00
Krunoslav Zaher 933cb02cb0 Adds `UIButton.setTitle` extensions to tvOS. 2016-06-26 14:37:10 +02:00
sergdort ada55ed8e5 Fixed compile error on all tests MAC os 2016-06-25 22:14:04 +03:00
sergdort 5bf319adda Made RxAllTests compile with Swift 3.0 2016-06-25 22:10:12 +03:00
Krunoslav Zaher 7a15347943 Adds UIButton.setTitle(:forState:) extensions. 2016-06-24 23:11:08 +02:00
Krunoslav Zaher c51f4f3b95 Merge branch 'jamiepinkham-swift-3.0' into swift-3.0 2016-06-23 11:06:13 +02:00
Jamie Pinkham c719c8cf86 fix compiler warnings about unused variables 2016-06-22 10:16:49 -04:00
Jamie Pinkham 5d47db7609 fix errors with RxCocoa introduced by merge 2016-06-22 10:15:37 -04:00
Jamie Pinkham 7ff150aafc clean up changes from merge 2016-06-22 10:01:59 -04:00
Jamie Pinkham 5a9f47262a Merge branch 'upstream-develop' into swift-3.0
# Conflicts:
#	RxCocoa/Common/CocoaUnits/Driver/Driver+Subscription.swift
#	RxCocoa/Common/CocoaUnits/UIBindingObserver.swift
#	RxSwift/Schedulers/MainScheduler.swift
2016-06-22 09:54:44 -04:00
Jamie Pinkham db4c04dcea use Foundation.Timer
and fix result of call unused warning
2016-06-22 09:51:01 -04:00
Jamie Pinkham 9287bebd10 fix retryWhen syntax 2016-06-22 09:37:32 -04:00
Jamie Pinkham 924a9a4983 clean up syntax to get test building
still trying to work out the ambiguious use compiler error
2016-06-22 09:34:04 -04:00
Jamie Pinkham 8d5b85306d fix up @noescape clauses 2016-06-21 08:48:45 -04:00
Jamie Pinkham bc86d47a3f swift 3.0 syntax updates for preprocessor and performance tools 2016-06-21 08:45:56 -04:00
Jamie Pinkham a5f19de922 fix reachability 2016-06-21 08:45:00 -04:00
baek-jinoo 8ce99d1219 Minor typo fix 2016-06-20 17:45:37 -07:00
Jamie Pinkham 8bad8e547f fix wireframe for mac tests 2016-06-20 14:06:36 -04:00
Jamie Pinkham ced6ce3a7e fixes the unit tests for the rx ios example 2016-06-20 14:04:42 -04:00
Jamie Pinkham ff0d588189 fix what tests i can 2016-06-18 15:43:27 -07:00
Jamie Pinkham c35136fe0b get example projects working.. woo! 2016-06-18 15:21:44 -07:00
Jamie Pinkham 39a20441e1 begin fixing up the examples 2016-06-18 01:24:07 -07:00
Jamie Pinkham c4cf2e0d12 builds ios, ios rx cocoa and ios rx blocking 2016-06-17 23:19:16 -07:00
Jamie Pinkham 0e38ecbc87 Merge branch 'develop' into swift-3.0
# Conflicts:
#	Documentation/DesignRationale.md
#	Rx.playground/Pages/Introduction.xcplaygroundpage/Contents.swift
#	RxCocoa/Common/DelegateProxyType.swift
#	RxCocoa/iOS/UICollectionView+Rx.swift
#	RxCocoa/iOS/UIControl+Rx.swift
#	RxCocoa/iOS/UIScrollView+Rx.swift
#	RxCocoa/iOS/UITableView+Rx.swift
#	RxExample/RxDataSources/DataSources+Rx/ObservableConvertibleType+Differentiator.swift
#	RxSwift/Concurrency/Lock.swift
#	RxSwift/Disposables/CompositeDisposable.swift
#	RxSwift/Event.swift
#	RxSwift/Extensions/String+Rx.swift
#	RxSwift/Schedulers/OperationQueueScheduler.swift
2016-06-17 21:14:06 -07:00
Krunoslav Zaher 6b038ad039 Merge pull request #701 from TheArtOfEngineering/swift-3.0
Add Swift 3 swift-DEVELOPMENT-SNAPSHOT-2016-05-09 compatibility.
2016-05-27 22:48:26 +02:00
Tyler Cloutier 94833e438d Add Swift 3 swift-DEVELOPMENT-SNAPSHOT-2016-05-09 compatibility. 2016-05-22 14:43:47 -07:00
Krunoslav Zaher a4ae75d03f Merge pull request #657 from thanegill/uilabel-rx_text
UILabel rx_text as `String?`
2016-05-02 21:29:46 +02:00
Thane Gill 37d685690c UILabel rx_text as `String?` 2016-04-30 11:13:38 -07:00
Krunoslav Zaher 7622d9c5b7 Fixes for Linux. 2016-04-22 21:07:20 +02:00
Krunoslav Zaher c11c7a8f97 Unifies atomics on Linux. 2016-04-22 21:01:45 +02:00
Krunoslav Zaher 4e6880d218 Fixes for RxSwift and Swift 3.0. 2016-04-22 20:49:18 +02:00
Krunoslav Zaher 1b5cd9ecb5 Fixing swift 3.0 warnings. 2016-04-22 13:14:41 +02:00
Krunoslav Zaher c4ca775bdc Changes for Swift 3.0. 2016-04-22 13:14:41 +02:00
489 changed files with 10604 additions and 10284 deletions

View File

@ -1,6 +1,6 @@
language: objective-c language: objective-c
osx_image: xcode7.3 osx_image: xcode8
notifications: notifications:
slack: rxswift:3ykt2Z61f8GkdvhCZTYPduOL slack: rxswift:3ykt2Z61f8GkdvhCZTYPduOL
@ -8,4 +8,6 @@ notifications:
script: script:
- "bundle exec danger --verbose" - "bundle exec danger --verbose"
- ./scripts/pre-release-tests.sh - xcodebuild -version
- xcodebuild -showsdks
- ./scripts/all-tests.sh

View File

@ -5,12 +5,61 @@ All notable changes to this project will be documented in this file.
## Master ## Master
## [3.0.0.alpha.1](https://github.com/ReactiveX/RxSwift/releases/tag/3.0.0.alpha.1) (Xcode 8 beta 6 compatible 8S201h)
#### Features #### Features
* Adds `rx_title` to `UIViewController`. * Modernizes API to be more consistent with Swift 3.0 API Design Guidelines
* Adds `rx_scrollEnabled` to `UIScrollView`. * Replaces `rx_*` prefix with `rx.*` extensions. (Inspired by `.lazy` collections API). We've tried annotate deprecated APIs with `@available(*, deprecated, renamed: "new method")` but trivial replacements aren't annotated.
* Adds bindings to `NSTextView` * `rx_text` -> `rx.text`
* Adds bindings to `NSProgressIndicator` * `rx_tap` -> `rx.tap`
* `rx_date` -> `rx.date`
* ...
* Deprecates `subscribeNext`, `subscribeError`, `subscribeCompleted` in favor of `subscribe(onNext:onError:onCompleted:onDisposed)` (The downsides of old extensions were inconsistencies with Swift API guidelines. They also weren't expressing that calling them actually performes additional subscriptions and thus potentially additional work beside just registering observers).
* Deprecates `doOnNext`, `doOnCompleted`, `doOnError` in favor of `do(onNext:onCompleted:onError:onSubscribe:onDisposed:)`
* Adds `onSubscribe` and `onDisposed` to `do` operator.
* Adds namespace for immutable disposables called `Disposables`
* Deprecates `AnonymousDisposable` in favor of `Disposables.create(with:)`
* Deprecates `NopDisposable` in favor of `Disposables.create()`
* Deprecates `BinaryDisposable` in favor of `Disposables.create(_:_:)`
* Deprecates `toObservable` in favor of `Observable.from()`.
* Replaces old javascript automation tests with Swift UI Tests.
* ...
#### Anomalies
* There is a problem using `UISwitch` extensions because it seems that a bug exists in UIKit that causes all `UISwitch` instances to leak. https://github.com/ReactiveX/RxSwift/issues/842
## [2.6.0](https://github.com/ReactiveX/RxSwift/releases/tag/2.6.0)
#### Features
* Adds Swift 2.3 compatibility.
* Adds `UIViewController.rx_title` extension.
* Adds `UIScrollView.rx_scrollEnabled` extension.
* Resolve static analysis issues relating to non-use of an assigned value, and potential null dereferences in RxCocoa's Objective-C classes.
* Changes `forwardDelegate` property type on `DelegateProxy` from `assign` to `weak`.
* Simplifies UITable/CollectionView data source generic parameters.
* Adds simple usage examples to UITable/CollectionView data source extensions.
* Documents UITable/CollectionView data source extensions memory management and adds unit tests to cover that documentation.
* Adds `.jazzy.yml`
* Adds `UITabBar` extensions and delegate proxy wrapper
* rx_didSelectItem
* rx_willBeginCustomizing
* rx_didBeginCustomizing
* rx_willEndCustomizing
* rx_didEndCustomizing
* Adds `UIPickerView` delegate proxy and extensions:
* rx_itemSelected
* Adds `UIAlertAction.rx_enabled` extension.
* Adds `UIButton.rx_title(controlState: UIControlState = .Normal)` extension.
* Adds `UIPageControl.rx_currentPage` extension.
* Adds `hasObservers` property to `*Subject`.
#### Anomalies
* Fixes problem with UITable/CollectionView releasing of data sources when result subscription disposable wasn't retained.
* Fixes all Xcode analyzer warnings
## [2.5.0](https://github.com/ReactiveX/RxSwift/releases/tag/2.5.0) ## [2.5.0](https://github.com/ReactiveX/RxSwift/releases/tag/2.5.0)
@ -94,12 +143,12 @@ All notable changes to this project will be documented in this file.
This is example of those changes: This is example of those changes:
```swift ```swift
- public func rx_itemsWithCellFactory<S : SequenceType, O : ObservableType where O.E == S> - public func rx_itemsWithCellFactory<S : Sequence, O : ObservableType where O.E == S>
(source: O) (source: O)
(cellFactory: (UITableView, Int, S.Generator.Element) -> UITableViewCell) -> Disposable (cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable
+ public func rx_itemsWithCellFactory<S : SequenceType, O : ObservableType where O.E == S> + public func rx_itemsWithCellFactory<S : Sequence, O : ObservableType where O.E == S>
(source: O) (source: O)
-> (cellFactory: (UITableView, Int, S.Generator.Element) -> UITableViewCell) -> Disposable -> (cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable
``` ```
* Fixes anomaly in `CLLocationManager` extensions * Fixes anomaly in `CLLocationManager` extensions
@ -371,7 +420,7 @@ let (
* `NSURLSession` extensions now return `Observable<(NSData!, NSHTTPURLResponse)>` instead of `Observable<(NSData!, NSURLResponse!)>`. * `NSURLSession` extensions now return `Observable<(NSData!, NSHTTPURLResponse)>` instead of `Observable<(NSData!, NSURLResponse!)>`.
* Optimizes consecutive map operators. For example `map(validate1).map(validate2).map(parse)` is now internally optimized to one `map` operator. * Optimizes consecutive map operators. For example `map(validate1).map(validate2).map(parse)` is now internally optimized to one `map` operator.
* Adds overloads for `just`, `sequenceOf`, `toObservable` that accept scheduler. * Adds overloads for `just`, `sequenceOf`, `toObservable` that accept scheduler.
* Deprecates `asObservable` extension of `SequenceType` in favor of `toObservable`. * Deprecates `asObservable` extension of `Sequence` in favor of `toObservable`.
* Adds `toObservable` extension to `Array`. * Adds `toObservable` extension to `Array`.
* Improves table view animated data source example. * Improves table view animated data source example.
* Polishing of `RxDataSourceStarterKit` * Polishing of `RxDataSourceStarterKit`
@ -483,7 +532,7 @@ let (
* Renames `ScopedDispose` to `ScopedDisposable` * Renames `ScopedDispose` to `ScopedDisposable`
* Deprecates `observeSingleOn` in favor of `observeOn` * Deprecates `observeSingleOn` in favor of `observeOn`
* Adds inline documentation * Adds inline documentation
* Renames `from` to `asObservable` extension method on `SequenceType` * Renames `from` to `asObservable` extension method on `Sequence`
* Renames `catchErrorResumeNext` in favor of `catchErrorJustReturn` * Renames `catchErrorResumeNext` in favor of `catchErrorJustReturn`
* Deprecates `catchErrorToResult`, the preferred way is to use Swift `do/try/catch` mechanism. * Deprecates `catchErrorToResult`, the preferred way is to use Swift `do/try/catch` mechanism.
* Deprecates `RxResult`, the preferred way is to use Swift `do/try/catch` mechanism. * Deprecates `RxResult`, the preferred way is to use Swift `do/try/catch` mechanism.

View File

@ -13,6 +13,14 @@ So what does this mean in practice:
* Please target your PR to **develop** branch * Please target your PR to **develop** branch
* If you want to make a bigger contribution to the project, please [open an issue first](https://github.com/ReactiveX/RxSwift/issues/new) so we can plan that work, discuss the architecture and brainstorm around that idea first. * If you want to make a bigger contribution to the project, please [open an issue first](https://github.com/ReactiveX/RxSwift/issues/new) so we can plan that work, discuss the architecture and brainstorm around that idea first.
## Submitting a Pull Request
Before submitting a pull request please make sure **`./scripts/all-tests.sh`** is passing (exits with 0), otherwise we won't be able to pull your code.
To be able to run `./scripts/all-tests.sh`, you'll need to install [xcpretty](https://github.com/supermarin/xcpretty).
`sudo gem install xcpretty`
## Developer's Certificate of Origin 1.1 ## Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that: By making a contribution to this project, I certify that:

View File

@ -1,6 +1,6 @@
# Warn about develop branch # Warn about develop branch
current_branch = env.request_source.pr_json["base"]["ref"] current_branch = env.request_source.pr_json["base"]["ref"]
warn("Please target PRs to `develop` branch") if current_branch != "develop" warn("Please target PRs to `develop` branch") if current_branch != "develop" && current_branch != "swift-3.0"
# Sometimes it's a README fix, or something like that - which isn't relevant for # Sometimes it's a README fix, or something like that - which isn't relevant for
# including in a project's CHANGELOG for example # including in a project's CHANGELOG for example

View File

@ -102,13 +102,13 @@ Creating new operators is also pretty straightforward.
```swift ```swift
extension NSObject { extension Reactive where Base: NSObject {
public var rx_deallocated: Observable<Void> {} public var deallocated: Observable<Void> {}
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
public var rx_deallocating: Observable<Void> {} public var deallocating: Observable<Void> {}
#endif #endif
@ -118,9 +118,9 @@ extension NSObject {
```swift ```swift
extension NSObject { extension Reactive where Base: NSObject {
public func rx_observe<Element>( public func observe<Element>(
type: E.Type, type: E.Type,
_ keyPath: String, _ keyPath: String,
options: NSKeyValueObservingOptions = .New | .Initial, options: NSKeyValueObservingOptions = .New | .Initial,
@ -129,7 +129,7 @@ extension NSObject {
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
public func rx_observeWeakly<Element>( public func observeWeakly<Element>(
type: E.Type, type: E.Type,
_ keyPath: String, _ keyPath: String,
options: NSKeyValueObservingOptions = .New | .Initial options: NSKeyValueObservingOptions = .New | .Initial
@ -140,23 +140,23 @@ extension NSObject {
``` ```
```swift ```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 ```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 ```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 ```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 ```swift
extension UIButton { extension Reactive where Base: UIButton {
public var rx_tap: ControlEvent<Void> {} public var tap: ControlEvent<Void> {}
} }
``` ```
```swift ```swift
extension UITextField { extension Reactive where Base: UITextField {
public var rx_text: ControlProperty<String> {} public var text: ControlProperty<String> {}
} }
``` ```
```swift ```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 ```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 ```swift
extension UILabel { extension Reactive where Base: UILabel {
public var rx_text: ObserverOf<String> {} public var text: ObserverOf<String> {}
} }
``` ```
```swift ```swift
extension UIDatePicker { extension Reactive where Base: UIDatePicker {
public var rx_date: ControlProperty<NSDate> {} public var date: ControlProperty<NSDate> {}
} }
``` ```
```swift ```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 ```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 ```swift
extension UIBarButtonItem { extension Reactive where Base: UIBarButtonItem {
public var rx_tap: ControlEvent<Void> {} public var tap: ControlEvent<Void> {}
} }
``` ```
```swift ```swift
extension UISlider { extension Reactive where Base: UISlider {
public var rx_value: ControlProperty<Float> {} public var value: ControlProperty<Float> {}
} }
``` ```
```swift ```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.Generator.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.Generator.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<NSIndexPath> {} public var itemSelected: ControlEvent<IndexPath> {}
public var rx_itemDeselected: ControlEvent<NSIndexPath> {} public var itemDeselected: ControlEvent<IndexPath> {}
public var rx_itemInserted: ControlEvent<NSIndexPath> {} public var itemInserted: ControlEvent<IndexPath> {}
public var rx_itemDeleted: ControlEvent<NSIndexPath> {} 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` // 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> {} 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` // 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> {} public func modelDeselected<T>(modelType: T.Type) -> ControlEvent<T> {}
} }
``` ```
```swift ```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.Generator.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.Generator.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<NSIndexPath> {} public var itemSelected: ControlEvent<IndexPath> {}
public var rx_itemDeselected: ControlEvent<NSIndexPath> {} public var itemDeselected: ControlEvent<IndexPath> {}
// This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` // 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> {} 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` // 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> {} public func modelSelected<T>(modelType: T.Type) -> ControlEvent<T> {}
} }
``` ```
```swift ```swift
extension UIGestureRecognizer { extension Reactive where Base: UIGestureRecognizer {
public var rx_event: ControlEvent<UIGestureRecognizer> {} public var event: ControlEvent<UIGestureRecognizer> {}
} }
``` ```
```swift ```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 ```swift
extension UISegmentedControl { extension Reactive where Base: UISegmentedControl {
public var rx_value: ControlProperty<Int> {} public var value: ControlProperty<Int> {}
} }
``` ```
```swift ```swift
extension UISwitch { extension Reactive where Base: UISwitch {
public var rx_value: ControlProperty<Bool> {} public var value: ControlProperty<Bool> {}
} }
``` ```
```swift ```swift
extension UIActivityIndicatorView { extension Reactive where Base: UIActivityIndicatorView {
public var rx_animating: AnyObserver<Bool> {} public var animating: AnyObserver<Bool> {}
} }
``` ```
```swift ```swift
extension UINavigationItem { extension Reactive where Base: UINavigationItem {
public var rx_title: AnyObserver<String?> {} public var title: AnyObserver<String?> {}
} }
``` ```
**OSX** **OSX**
```swift ```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 ```swift
extension NSSlider { extension Reactive where Base: NSSlider {
public var rx_value: ControlProperty<Double> {} public var value: ControlProperty<Double> {}
} }
``` ```
```swift ```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 ```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 ```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 ```swift
extension UITabBarItem { extension Reactive where Base: UITabBarItem {
public var rx_badgeValue: AnyObserver<String?> {} public var badgeValue: AnyObserver<String?> {}
} }
``` ```
```swift ```swift
extension UITabBar { extension Reactive where Base: UITabBar {
public var rx_didSelectItem: ControlEvent<UITabBarItem> {} public var didSelectItem: ControlEvent<UITabBarItem> {}
public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {} public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {} public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {}
public var rx_willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} public var willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
public var rx_didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} public var didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {}
} }
``` ```

View File

@ -49,9 +49,9 @@ let c = Observable.combineLatest(a.asObservable(), b.asObservable()) { $0 + $1 }
// 1 + 2 = 3 which is >= 0, so `c` is initially equal to "3 is positive" // 1 + 2 = 3 which is >= 0, so `c` is initially equal to "3 is positive"
// To pull values out of the Rx `Observable` `c`, subscribe to values from `c`. // To pull values out of the Rx `Observable` `c`, subscribe to values from `c`.
// `subscribeNext` means subscribe to the next (fresh) values of `c`. // `subscribe(onNext:)` means subscribe to the next (fresh) values of `c`.
// That also includes the initial value "3 is positive". // That also includes the initial value "3 is positive".
c.subscribeNext { print($0) } // prints: "3 is positive" c.subscribe(onNext: { print($0) }) // prints: "3 is positive"
// Now, let's increase the value of `a` // Now, let's increase the value of `a`
a.value = 4 // prints: 6 is positive a.value = 4 // prints: 6 is positive
@ -72,17 +72,17 @@ b.value = -8 // doesn't print anything
## Simple UI bindings ## 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 * 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` * 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` * Bind the results to a `UILabel`
```swift ```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>> .map { WolframAlphaIsPrime(Int($0) ?? 0) } // type is Observable<Observable<Prime>>
.concat() // type is Observable<Prime> .concat() // type is Observable<Prime>
.map { "number \($0.n) is prime? \($0.isPrime)" } // type is Observable<String> .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 // This will set `resultLabel.text` to "number 43 is prime? true" after
// server call completes. // server call completes.
@ -108,7 +108,7 @@ Let's give it a shot.
```swift ```swift
// bind UI control values directly // bind UI control values directly
// use username from `usernameOutlet` as username values source // use username from `usernameOutlet` as username values source
self.usernameOutlet.rx_text self.usernameOutlet.rx.text
.map { username in .map { username in
// synchronous validation, nothing special here // synchronous validation, nothing special here
@ -152,12 +152,12 @@ self.usernameOutlet.rx_text
// That's what `switchLatest` does. // That's what `switchLatest` does.
.switchLatest() .switchLatest()
// Now we need to bind that to the user interface somehow. // Now we need to bind that to the user interface somehow.
// Good old `subscribeNext` can do that. // Good old `subscribe(onNext:)` can do that.
// That's the end of `Observable` chain. // That's the end of `Observable` chain.
.subscribeNext { valid in .subscribe(onNext: { valid in
errorLabel.textColor = validationColor(valid) errorLabel.textColor = validationColor(valid)
errorLabel.text = valid.message errorLabel.text = valid.message
} })
// This will produce a `Disposable` object that can unbind everything and cancel // This will produce a `Disposable` object that can unbind everything and cancel
// pending async operations. // pending async operations.
// Instead of doing it manually, which is tedious, // Instead of doing it manually, which is tedious,

View File

@ -67,32 +67,32 @@ These are called marble diagrams. There are more marble diagrams at [rxmarbles.c
If we were to specify sequence grammar as a regular expression it would look like: If we were to specify sequence grammar as a regular expression it would look like:
**Next* (Error | Completed)?** **next* (error | completed)?**
This describes the following: This describes the following:
* **Sequences can have 0 or more elements.** * **Sequences can have 0 or more elements.**
* **Once an `Error` or `Completed` event is received, the sequence cannot produce any other element.** * **Once an `error` or `completed` event is received, the sequence cannot produce any other element.**
Sequences in Rx are described by a push interface (aka callback). Sequences in Rx are described by a push interface (aka callback).
```swift ```swift
enum Event<Element> { enum Event<Element> {
case Next(Element) // next element of a sequence case next(Element) // next element of a sequence
case Error(ErrorType) // sequence failed with error case error(Swift.Error) // sequence failed with error
case Completed // sequence terminated successfully case completed // sequence terminated successfully
} }
class Observable<Element> { class Observable<Element> {
func subscribe(observer: Observer<Element>) -> Disposable func subscribe(_ observer: Observer<Element>) -> Disposable
} }
protocol ObserverType { protocol ObserverType {
func on(event: Event<Element>) func on(_ event: Event<Element>)
} }
``` ```
**When a sequence sends the `Completed` or `Error` event all internal resources that compute sequence elements will be freed.** **When a sequence sends the `completed` or `error` event all internal resources that compute sequence elements will be freed.**
**To cancel production of sequence elements and free resources immediately, call `dispose` on the returned subscription.** **To cancel production of sequence elements and free resources immediately, call `dispose` on the returned subscription.**
@ -102,7 +102,7 @@ If a sequence does not terminate in some way, resources will be allocated perman
**Using dispose bags or `takeUntil` operator is a robust way of making sure resources are cleaned up. We recommend using them in production even if the sequences will terminate in finite time.** **Using dispose bags or `takeUntil` operator is a robust way of making sure resources are cleaned up. We recommend using them in production even if the sequences will terminate in finite time.**
In case you are curious why `ErrorType` isn't generic, you can find explanation [here](DesignRationale.md#why-error-type-isnt-generic). In case you are curious why `Swift.Error` isn't generic, you can find explanation [here](DesignRationale.md#why-error-type-isnt-generic).
## Disposing ## Disposing
@ -116,7 +116,7 @@ let subscription = Observable<Int>.interval(0.3, scheduler: scheduler)
print(event) print(event)
} }
NSThread.sleepForTimeInterval(2) NSThread.sleep(forTimeInterval: 2.0)
subscription.dispose() subscription.dispose()
@ -133,7 +133,7 @@ This will print:
5 5
``` ```
Note the you usually do not want to manually call `dispose`; this is only educational example. Calling dispose manually is usually a bad code smell. There are better ways to dispose subscriptions. We can use `DisposeBag`, the `takeUntil` operator, or some other mechanism. Note that you usually do not want to manually call `dispose`; this is only educational example. Calling dispose manually is usually a bad code smell. There are better ways to dispose subscriptions. We can use `DisposeBag`, the `takeUntil` operator, or some other mechanism.
So can this code print something after the `dispose` call executed? The answer is: it depends. So can this code print something after the `dispose` call executed? The answer is: it depends.
@ -208,7 +208,7 @@ Additional way to automatically dispose subscription on dealloc is to use `takeU
```swift ```swift
sequence sequence
.takeUntil(self.rx_deallocated) .takeUntil(self.rx.deallocated)
.subscribe { .subscribe {
print($0) print($0)
} }
@ -218,9 +218,9 @@ sequence
There is also a couple of additional guarantees that all sequence producers (`Observable`s) must honor. There is also a couple of additional guarantees that all sequence producers (`Observable`s) must honor.
It doesn't matter on which thread they produce elements, but if they generate one element and send it to the observer `observer.on(.Next(nextElement))`, they can't send next element until `observer.on` method has finished execution. It doesn't matter on which thread they produce elements, but if they generate one element and send it to the observer `observer.on(.next(nextElement))`, they can't send next element until `observer.on` method has finished execution.
Producers also cannot send terminating `.Completed` or `.Error` in case `.Next` event hasn't finished. Producers also cannot send terminating `.completed` or `.error` in case `.next` event hasn't finished.
In short, consider this example: In short, consider this example:
@ -276,9 +276,9 @@ let searchForMe = searchWikipedia("me")
let cancel = searchForMe let cancel = searchForMe
// sequence generation starts now, URL requests are fired // sequence generation starts now, URL requests are fired
.subscribeNext { results in .subscribe(onNext: { results in
print(results) print(results)
} })
``` ```
@ -291,16 +291,16 @@ Let's create a function which creates a sequence that returns one element upon s
```swift ```swift
func myJust<E>(element: E) -> Observable<E> { func myJust<E>(element: E) -> Observable<E> {
return Observable.create { observer in return Observable.create { observer in
observer.on(.Next(element)) observer.on(.next(element))
observer.on(.Completed) observer.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
} }
myJust(0) myJust(0)
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
``` ```
this will print: this will print:
@ -325,11 +325,11 @@ Lets now create an observable that returns elements from an array.
func myFrom<E>(sequence: [E]) -> Observable<E> { func myFrom<E>(sequence: [E]) -> Observable<E> {
return Observable.create { observer in return Observable.create { observer in
for element in sequence { for element in sequence {
observer.on(.Next(element)) observer.on(.next(element))
} }
observer.on(.Completed) observer.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
} }
@ -339,17 +339,17 @@ print("Started ----")
// first time // first time
stringCounter stringCounter
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
print("----") print("----")
// again // again
stringCounter stringCounter
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
print("Ended ----") print("Ended ----")
``` ```
@ -382,15 +382,15 @@ func myInterval(interval: NSTimeInterval) -> Observable<Int> {
var next = 0 var next = 0
dispatch_source_set_timer(timer, 0, UInt64(interval * Double(NSEC_PER_SEC)), 0) dispatch_source_set_timer(timer, 0, UInt64(interval * Double(NSEC_PER_SEC)), 0)
let cancel = AnonymousDisposable { let cancel = Disposables.create {
print("Disposed") print("Disposed")
dispatch_source_cancel(timer) dispatch_source_cancel(timer)
} }
dispatch_source_set_event_handler(timer, { dispatch_source_set_event_handler(timer, {
if cancel.disposed { if cancel.isDisposed {
return return
} }
observer.on(.Next(next)) observer.on(.next(next))
next += 1 next += 1
}) })
dispatch_resume(timer) dispatch_resume(timer)
@ -406,11 +406,12 @@ let counter = myInterval(0.1)
print("Started ----") print("Started ----")
let subscription = counter let subscription = counter
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
NSThread.sleepForTimeInterval(0.5)
NSThread.sleep(forTimeInterval: 0.5)
subscription.dispose() subscription.dispose()
@ -438,19 +439,19 @@ let counter = myInterval(0.1)
print("Started ----") print("Started ----")
let subscription1 = counter let subscription1 = counter
.subscribeNext { n in .subscribe(onNext: { n in
print("First \(n)") print("First \(n)")
} })
let subscription2 = counter let subscription2 = counter
.subscribeNext { n in .subscribe(onNext: { n in
print("Second \(n)") print("Second \(n)")
} })
NSThread.sleepForTimeInterval(0.5) NSThread.sleep(forTimeInterval: 0.5)
subscription1.dispose() subscription1.dispose()
NSThread.sleepForTimeInterval(0.5) NSThread.sleep(forTimeInterval: 0.5)
subscription2.dispose() subscription2.dispose()
@ -503,13 +504,13 @@ let counter = myInterval(0.1)
print("Started ----") print("Started ----")
let subscription1 = counter let subscription1 = counter
.subscribeNext { n in .subscribe(onNext: { n in
print("First \(n)") print("First \(n)")
} })
let subscription2 = counter let subscription2 = counter
.subscribeNext { n in .subscribe(onNext: { n in
print("Second \(n)") print("Second \(n)")
} })
NSThread.sleepForTimeInterval(0.5) NSThread.sleepForTimeInterval(0.5)
@ -554,27 +555,27 @@ 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. This is how HTTP requests are wrapped in Rx. It's pretty much the same pattern like the `interval` operator.
```swift ```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)> {
return Observable.create { observer in return Observable.create { observer in
let task = self.dataTaskWithRequest(request) { (data, response, error) in let task = self.dataTaskWithRequest(request) { (data, response, error) in
guard let response = response, data = data else { guard let response = response, data = data else {
observer.on(.Error(error ?? RxCocoaURLError.Unknown)) observer.on(.error(error ?? RxCocoaURLError.Unknown))
return return
} }
guard let httpResponse = response as? NSHTTPURLResponse else { guard let httpResponse = response as? NSHTTPURLResponse else {
observer.on(.Error(RxCocoaURLError.NonHTTPResponse(response: response))) observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))
return return
} }
observer.on(.Next(data, httpResponse)) observer.on(.next(data, httpResponse))
observer.on(.Completed) observer.on(.completed)
} }
task.resume() task.resume()
return AnonymousDisposable { return Disposables.create {
task.cancel() task.cancel()
} }
} }
@ -614,13 +615,13 @@ extension ObservableType {
return Observable.create { observer in return Observable.create { observer in
let subscription = self.subscribe { e in let subscription = self.subscribe { e in
switch e { switch e {
case .Next(let value): case .next(let value):
let result = transform(value) let result = transform(value)
observer.on(.Next(result)) observer.on(.next(result))
case .Error(let error): case .error(let error):
observer.on(.Error(error)) observer.on(.error(error))
case .Completed: case .completed:
observer.on(.Completed) observer.on(.completed)
} }
} }
@ -637,9 +638,9 @@ let subscription = myInterval(0.1)
.myMap { e in .myMap { e in
return "This is simply \(e)" return "This is simply \(e)"
} }
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
``` ```
and this will print and this will print
@ -668,9 +669,9 @@ This isn't something that should be practiced often, and is a bad code smell, bu
let magicBeings: Observable<MagicBeing> = summonFromMiddleEarth() let magicBeings: Observable<MagicBeing> = summonFromMiddleEarth()
magicBeings magicBeings
.subscribeNext { being in // exit the Rx monad .subscribe(onNext: { being in // exit the Rx monad
self.doSomeStateMagic(being) self.doSomeStateMagic(being)
} })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
// //
@ -680,7 +681,7 @@ This isn't something that should be practiced often, and is a bad code smell, bu
being, being,
UIApplication.delegate.dataSomething.attendees UIApplication.delegate.dataSomething.attendees
) )
kittens.on(.Next(kitten)) // send result back to rx kittens.on(.next(kitten)) // send result back to rx
// //
// Another mess // Another mess
// //
@ -698,9 +699,9 @@ Every time you do this, somebody will probably write this code somewhere
```swift ```swift
kittens kittens
.subscribeNext { kitten in .subscribe(onNext: { kitten in
// so something with kitten // so something with kitten
} })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
``` ```
@ -716,7 +717,7 @@ If you are unsure how exactly some of the operators work, [playgrounds](../Rx.pl
## Error handling ## Error handling
The are two error mechanisms. There are two error mechanisms.
### Asynchronous error handling mechanism in observables ### Asynchronous error handling mechanism in observables
@ -783,9 +784,9 @@ let subscription = myInterval(0.1)
.map { e in .map { e in
return "This is simply \(e)" return "This is simply \(e)"
} }
.subscribeNext { n in .subscribe(onNext: { n in
print(n) print(n)
} })
NSThread.sleepForTimeInterval(0.5) NSThread.sleepForTimeInterval(0.5)
@ -797,15 +798,15 @@ will print
``` ```
[my probe] subscribed [my probe] subscribed
Subscribed Subscribed
[my probe] -> Event Next(Box(0)) [my probe] -> Event next(Box(0))
This is simply 0 This is simply 0
[my probe] -> Event Next(Box(1)) [my probe] -> Event next(Box(1))
This is simply 1 This is simply 1
[my probe] -> Event Next(Box(2)) [my probe] -> Event next(Box(2))
This is simply 2 This is simply 2
[my probe] -> Event Next(Box(3)) [my probe] -> Event next(Box(3))
This is simply 3 This is simply 3
[my probe] -> Event Next(Box(4)) [my probe] -> Event next(Box(4))
This is simply 4 This is simply 4
[my probe] dispose [my probe] dispose
Disposed Disposed
@ -821,17 +822,17 @@ extension ObservableType {
let subscription = self.subscribe { e in let subscription = self.subscribe { e in
print("event \(identifier) \(e)") print("event \(identifier) \(e)")
switch e { switch e {
case .Next(let value): case .next(let value):
observer.on(.Next(value)) observer.on(.next(value))
case .Error(let error): case .error(let error):
observer.on(.Error(error)) observer.on(.error(error))
case .Completed: case .completed:
observer.on(.Completed) observer.on(.completed)
} }
} }
return AnonymousDisposable { return Disposables.create {
print("disposing \(identifier)") print("disposing \(identifier)")
subscription.dispose() subscription.dispose()
} }
@ -851,9 +852,9 @@ In case you want to have some resource leak detection logic, the simplest method
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
*/ */
_ = Observable<Int>.interval(1, scheduler: MainScheduler.instance) _ = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.subscribeNext { _ in .subscribe(onNext: { _ in
print("Resource count \(RxSwift.resourceCount)") print("Resource count \(RxSwift.resourceCount)")
} })
``` ```
Most efficient way to test for memory leaks is: Most efficient way to test for memory leaks is:
@ -875,7 +876,7 @@ The reason why 2 navigations are suggested is because first navigation forces lo
Variable wraps a [`Subject`](http://reactivex.io/documentation/subject.html). More specifically it is a `BehaviorSubject`. Unlike `BehaviorSubject`, it only exposes `value` interface, so variable can never terminate or fail. Variable wraps a [`Subject`](http://reactivex.io/documentation/subject.html). More specifically it is a `BehaviorSubject`. Unlike `BehaviorSubject`, it only exposes `value` interface, so variable can never terminate or fail.
It will also broadcast it's current value immediately on subscription. It will also broadcast its current value immediately on subscription.
After variable is deallocated, it will complete the observable sequence returned from `.asObservable()`. After variable is deallocated, it will complete the observable sequence returned from `.asObservable()`.
@ -933,14 +934,14 @@ There are two built in ways this library supports KVO.
```swift ```swift
// KVO // KVO
extension NSObject { extension Reactive where Base: NSObject {
public func rx_observe<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable<E?> {} public func observe<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable<E?> {}
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
// KVO // KVO
extension NSObject { extension Reactive where Base: NSObject {
public func rx_observeWeakly<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable<E?> {} public func observeWeakly<E>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable<E?> {}
} }
#endif #endif
``` ```
@ -951,25 +952,25 @@ Example how to observe frame of `UIView`.
```swift ```swift
view view
.rx_observe(CGRect.self, "frame") .rx.observe(CGRect.self, "frame")
.subscribeNext { frame in .subscribe(onNext: { frame in
... ...
} })
``` ```
or or
```swift ```swift
view view
.rx_observeWeakly(CGRect.self, "frame") .rx.observeWeakly(CGRect.self, "frame")
.subscribeNext { frame in .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 `self` or from ancestors in ownership graph (`retainSelf = false`)
* it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)
@ -978,14 +979,14 @@ view
E.g. E.g.
```swift ```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 * 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 * it can be used to observe `weak` properties
@ -993,7 +994,7 @@ It can be used in all cases where `rx_observe` can be used and additionally
E.g. E.g.
```swift ```swift
someSuspiciousViewController.rx_observeWeakly(Bool.self, "behavingOk") someSuspiciousViewController.rx.observeWeakly(Bool.self, "behavingOk")
``` ```
### Observing structs ### Observing structs
@ -1004,7 +1005,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. 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 ## UI layer tips
@ -1070,18 +1071,18 @@ 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. If you want to just execute that request outside of composition with other observables, this is what needs to be done.
```swift ```swift
let responseJSON = NSURLSession.sharedSession().rx_JSON(request) let responseJSON = NSURLSession.sharedSession().rx.JSON(request)
// no requests will be performed up to this point // no requests will be performed up to this point
// `responseJSON` is just a description how to fetch the response // `responseJSON` is just a description how to fetch the response
let cancelRequest = responseJSON let cancelRequest = responseJSON
// this will fire the request // this will fire the request
.subscribeNext { json in .subscribe(onNext: { json in
print(json) print(json)
} })
NSThread.sleepForTimeInterval(3) NSThread.sleep(forTimeInterval: 3.0)
// if you want to cancel request after 3 seconds have passed just call // if you want to cancel request after 3 seconds have passed just call
cancelRequest.dispose() cancelRequest.dispose()
@ -1093,7 +1094,7 @@ cancelRequest.dispose()
In case you want a more low level access to response, you can use: In case you want a more low level access to response, you can use:
```swift ```swift
NSURLSession.sharedSession().rx_response(myNSURLRequest) NSURLSession.shared.rx.response(myNSURLRequest)
.debug("my request") // this will print out information to console .debug("my request") // this will print out information to console
.flatMap { (data: NSData!, response: NSURLResponse!) -> Observable<String> in .flatMap { (data: NSData!, response: NSURLResponse!) -> Observable<String> in
if let response = response as? NSHTTPURLResponse { if let response = response as? NSHTTPURLResponse {

View File

@ -1,45 +0,0 @@
**Please copy the following template [here](https://github.com/ReactiveX/RxSwift/issues/new) and fill in the missing fields so we can help you as soon as possible.**
**If you don't have something to report in the following format, it will probably be easier and faster to ask in the [slack channel](http://http://slack.rxswift.org/) first.**
```
*Short description*:
description here
*Code that reproduces the issue*:
code goes here
*Xcode version*:
Xcode version goes here
*Expected outcome*:
what you expect to happen goes here
*What actually happens*:
what actually happens goes here
// filling in additional information below is optional, but resolving your issue could potentially be a lot faster
*Installation method*:
(so we don't waste time investigating an incorrect integration)
* CocoaPods
* Carthage
* Git submodules
*I have multiple versions of Xcode installed*:
(so we can know if this is a potential cause of your issue)
* yes (which ones)
* no
*Level of RxSwift knowledge*:
(this is so we can understand your level of knowledge
and formulate the response in an appropriate manner)
* just starting
* I have a small code base
* I have a significant code base
```

View File

@ -28,4 +28,4 @@ What works:
What doesn't work: What doesn't work:
* Schedulers - because they are dependent on https://github.com/apple/swift-corelibs-libdispatch and it still hasn't been released * Schedulers - because they are dependent on https://github.com/apple/swift-corelibs-libdispatch and it still hasn't been released
* Multithreading - still no access to c11 locks * Multithreading - still no access to c11 locks
* For some reason it looks like Swift compiler generates wrong code when using `ErrorType` on `Linux`, so don't use errors, otherwise you can get weird crashes. * For some reason it looks like Swift compiler generates wrong code when using `Swift.Error` on `Linux`, so don't use errors, otherwise you can get weird crashes.

View File

@ -13,7 +13,7 @@ There are two main operators that work with schedulers, `observeOn` and `subscri
If you want to perform work on a different scheduler just use `observeOn(scheduler)` operator. If you want to perform work on a different scheduler just use `observeOn(scheduler)` operator.
You would usually use `observeOn` a lot more often then `subscribeOn`. You would usually use `observeOn` a lot more often than `subscribeOn`.
In case `observeOn` isn't explicitly specified, work will be performed on whichever thread/scheduler elements are generated. In case `observeOn` isn't explicitly specified, work will be performed on whichever thread/scheduler elements are generated.
@ -33,7 +33,7 @@ sequence1
If you want to start sequence generation (`subscribe` method) and call dispose on a specific scheduler, use `subscribeOn(scheduler)`. If you want to start sequence generation (`subscribe` method) and call dispose on a specific scheduler, use `subscribeOn(scheduler)`.
In case `subscribeOn` isn't explicitly specified, the `subscribe` method will be called on the same thread/scheduler on which `subscribeNext` or `subscribe` is called. In case `subscribeOn` isn't explicitly specified, the `subscribe` method will be called on the same thread/scheduler on which `subscribe(onNext:)` or `subscribe` is called.
In case `subscribeOn` isn't explicitly specified, the `dispose` method will be called on the same thread/scheduler that initiated disposing. In case `subscribeOn` isn't explicitly specified, the `dispose` method will be called on the same thread/scheduler that initiated disposing.

View File

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

View File

@ -55,7 +55,7 @@ _ = xs
.filter { ... } .filter { ... }
.map { ... } .map { ... }
.switchLatest() .switchLatest()
.takeUntil(someObject.rx_deallocated) // <-- note the `takeUntil` operator .takeUntil(someObject.deallocated) // <-- note the `takeUntil` operator
.subscribe(onNext: { .subscribe(onNext: {
... ...
}, onError: { }, onError: {
@ -114,9 +114,9 @@ let disposeBag = DisposeBag()
xs xs
.filter { ... } .filter { ... }
.map { ... } .map { ... }
.subscribeNext { nextElement in // <-- note the `subscribe*` method .subscribe(onNext: { nextElement in // <-- note the `subscribe*` method
// use the element // use the element
print(nextElement) print(nextElement)
} })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
``` ```

51
ISSUE_TEMPLATE.md Normal file
View File

@ -0,0 +1,51 @@
:warning: If you don't have something to report in the following format, it will probably be easier and faster to ask in the [slack channel](http://http://slack.rxswift.org/) first. :warning:
**Short description of the issue**:
_description here_
**Self contained code example that reproduces the issue**:
```swift
code goes here
// If we can't get a self contained code example that reproduces the issue, there is a big chance we won't be able
// to help you because there is not much we can do.
// `Self contained code example` means:
// * that we should be able to just run the provided code without changing it.
// * that it will reproduce the issue upon running
```
**Xcode version**:
```
Xcode version goes here
```
**Expected outcome**:
_what you expect to happen goes here_
**What actually happens**:
_what actually happens goes here_
:warning: Fields below are optional for general issues or in case those questions aren't related to your issue, but filling them out will increase the chances of getting your issue resolved. :warning:
**Installation method**:
- [ ] CocoaPods
- [ ] Carthage
- [ ] Git submodules
**I have multiple versions of Xcode installed**:
(so we can know if this is a potential cause of your issue)
- [ ] yes (which ones)
- [ ] no
**Level of RxSwift knowledge**:
(this is so we can understand your level of knowledge
and formulate the response in an appropriate manner)
- [ ] just starting
- [ ] I have a small code base
- [ ] I have a significant code base

View File

@ -3,11 +3,6 @@ import PackageDescription
#if os(OSX) #if os(OSX)
let package = Package( let package = Package(
name: "RxSwift", name: "RxSwift",
exclude: [
"Sources/RxCocoa",
"Sources/RxTests",
"Sources/AllTests"
],
targets: [ targets: [
Target( Target(
name: "RxSwift" name: "RxSwift"
@ -32,14 +27,16 @@ let package = Package(
.Target(name: "RxTests") .Target(name: "RxTests")
] ]
) )
],
exclude: [
"Sources/RxCocoa",
"Sources/RxTests",
"Sources/AllTests"
] ]
) )
#elseif os(Linux) #elseif os(Linux)
let package = Package( let package = Package(
name: "RxSwift", name: "RxSwift",
exclude: [
"Sources/RxCocoa",
],
targets: [ targets: [
Target( Target(
name: "RxSwift" name: "RxSwift"
@ -64,6 +61,9 @@ let package = Package(
.Target(name: "RxTests") .Target(name: "RxTests")
] ]
) )
],
exclude: [
"Sources/RxCocoa",
] ]
) )
#endif #endif

View File

@ -166,6 +166,7 @@
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx; SDKROOT = macosx;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
}; };
name = Debug; name = Debug;
}; };
@ -201,6 +202,7 @@
MACOSX_DEPLOYMENT_TARGET = 10.10; MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx; SDKROOT = macosx;
SWIFT_VERSION = 3.0;
}; };
name = Release; name = Release;
}; };

View File

@ -16,28 +16,29 @@ if Process.argc != 3 {
let sourceFilesRoot = Process.arguments[1] let sourceFilesRoot = Process.arguments[1]
let derivedData = Process.arguments[2] let derivedData = Process.arguments[2]
let fileManager = NSFileManager() let fileManager = FileManager()
func escape(value: String) -> String { func escape(value: String) -> String {
let escapedString = value.stringByReplacingOccurrencesOfString("\n", withString: "\\n") let escapedString = value.replacingOccurrences(of: "\n", with: "\\n")
let escapedString1 = escapedString.stringByReplacingOccurrencesOfString("\r", withString: "\\r") let escapedString1 = escapedString.replacingOccurrences(of: "\r", with: "\\r")
let escapedString2 = escapedString1.stringByReplacingOccurrencesOfString("\"", withString: "\\\"") let escapedString2 = escapedString1.replacingOccurrences(of: "\"", with: "\\\"")
return "\"\(escapedString2)\"" return "\"\(escapedString2)\""
} }
func processFile(path: String, outputPath: String) -> String { func processFile(path: String, outputPath: String) -> String {
let rawContent = NSData(contentsOfFile: path)! let url = URL(fileURLWithPath: path)
let content = NSString(data: rawContent, encoding: NSUTF8StringEncoding)! as String let rawContent = try! Data(contentsOf: url)
let content = String(data: rawContent, encoding: String.Encoding.utf8)
let components = content.componentsSeparatedByString("<%") guard let components = content?.components(separatedBy: "<%") else { return "" }
var functionContentComponents: [String] = [] var functionContentComponents: [String] = []
functionContentComponents.append("var components: [String] = [\"// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \\n\"]\n") functionContentComponents.append("var components: [String] = [\"// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \\n\"]\n")
functionContentComponents.append("components.append(\(escape(components[0])))\n") functionContentComponents.append("components.append(\(escape(value: components[0])))\n")
for codePlusSuffix in (components[1 ..< components.count]) { for codePlusSuffix in (components[1 ..< components.count]) {
let codePlusSuffixSeparated = codePlusSuffix.componentsSeparatedByString("%>") let codePlusSuffixSeparated = codePlusSuffix.components(separatedBy: "%>")
if codePlusSuffixSeparated.count != 2 { if codePlusSuffixSeparated.count != 2 {
fatalError("Error in \(path) near \(codePlusSuffix)") fatalError("Error in \(path) near \(codePlusSuffix)")
} }
@ -46,24 +47,24 @@ func processFile(path: String, outputPath: String) -> String {
let suffix = codePlusSuffixSeparated[1] let suffix = codePlusSuffixSeparated[1]
if code.hasPrefix("=") { if code.hasPrefix("=") {
functionContentComponents.append("components.append(String(\(code.substringFromIndex(code.startIndex.successor()))))\n") functionContentComponents.append("components.append(String(\(code.substring(from: code.index(after: code.startIndex)))))\n")
} }
else { else {
functionContentComponents.append("\(code)\n") functionContentComponents.append("\(code)\n")
} }
functionContentComponents.append("components.append(\(escape(suffix)));\n") functionContentComponents.append("components.append(\(escape(value: suffix)));\n")
} }
functionContentComponents.append("try! components.joinWithSeparator(\"\").writeToFile(\"\(outputPath)\", atomically: false, encoding: NSUTF8StringEncoding)") functionContentComponents.append("try! components.joined(separator:\"\").write(toFile:\"\(outputPath)\", atomically: false, encoding: String.Encoding.utf8)")
return functionContentComponents.joinWithSeparator("") return functionContentComponents.joined(separator: "")
} }
func runCommand(path: String) { func runCommand(path: String) {
_ = NSProcessInfo().processIdentifier _ = ProcessInfo().processIdentifier
let task = NSTask() let task = Task()
task.launchPath = "/bin/bash" task.launchPath = "/bin/bash"
task.arguments = ["-c", "xcrun swift \"\(path)\""] task.arguments = ["-c", "xcrun swift \"\(path)\""]
@ -71,34 +72,34 @@ func runCommand(path: String) {
task.waitUntilExit() task.waitUntilExit()
if task.terminationReason != NSTaskTerminationReason.Exit { if task.terminationReason != Task.TerminationReason.exit {
exit(-1) exit(-1)
} }
} }
let files = fileManager.subpathsAtPath(sourceFilesRoot) let files = try fileManager.subpathsOfDirectory(atPath: sourceFilesRoot)
var generateAllFiles = ["// Generated code\n", "import Foundation\n"] var generateAllFiles = ["// Generated code\n", "import Foundation\n"]
for file in files! { for file in files {
if ((file as NSString).pathExtension ?? "") != "tt" { if ((file as NSString).pathExtension ?? "") != "tt" {
continue continue
} }
print(file) print(file)
let path = (sourceFilesRoot as NSString).stringByAppendingPathComponent(file as String) let path = (sourceFilesRoot as NSString).appendingPathComponent(file as String)
let endIndex = path.index(before: path.index(before: path.index(before: path.endIndex)))
let outputPath = path.substring(to: endIndex) + ".swift"
let outputPath = path.substringToIndex(path.endIndex.predecessor().predecessor().predecessor()) + ".swift" generateAllFiles.append("_ = { () -> Void in\n\(processFile(path: path, outputPath: outputPath))\n}()\n")
generateAllFiles.append("_ = { () -> Void in\n\(processFile(path, outputPath: outputPath))\n}()\n")
} }
let script = generateAllFiles.joinWithSeparator("") let script = generateAllFiles.joined(separator: "")
let scriptPath = (derivedData as NSString).stringByAppendingPathComponent("_preprocessor.sh") let scriptPath = (derivedData as NSString).appendingPathComponent("_preprocessor.sh")
do { do {
try script.writeToFile(scriptPath, atomically: true, encoding: NSUTF8StringEncoding) try script.write(toFile: scriptPath, atomically: true, encoding: String.Encoding.utf8)
} catch _ { } catch _ {
} }
runCommand(scriptPath) runCommand(path: scriptPath)

View File

@ -3,10 +3,12 @@
[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OSX%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux%28experimental%29-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OSX%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux%28experimental%29-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
Xcode 7.3 Swift 2.2 required
## About Rx ## About Rx
**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0:warning:**
**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch :warning:**
Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface. Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface.
This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET).
@ -33,6 +35,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md) * [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)
* [what does the the public API look like?](Documentation/API.md) * [what does the the public API look like?](Documentation/API.md)
###### ... install ###### ... install
* Integrate RxSwift/RxCocoa with my app. [Installation Guide](Documentation/Installation.md) * Integrate RxSwift/RxCocoa with my app. [Installation Guide](Documentation/Installation.md)
@ -44,8 +47,8 @@ KVO observing, async operations and streams are all unified under [abstraction o
###### ... interact ###### ... interact
* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[![Slack channel](http://slack.rxswift.org/badge.svg)](http://slack.rxswift.org) [Join Slack Channel](http://slack.rxswift.org/) * All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://slack.rxswift.org) [Join Slack Channel](http://rxswift-slack.herokuapp.com)
* Report a problem using the library. [Open an Issue With Bug Template](Documentation/IssueTemplate.md) * Report a problem using the library. [Open an Issue With Bug Template](ISSUE_TEMPLATE.md)
* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md) * Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)
@ -77,7 +80,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
</tr> </tr>
<tr> <tr>
<td><div class="highlight highlight-source-swift"><pre> <td><div class="highlight highlight-source-swift"><pre>
let searchResults = searchBar.rx_text let searchResults = searchBar.rx.text
.throttle(0.3, scheduler: MainScheduler.instance) .throttle(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged() .distinctUntilChanged()
.flatMapLatest { query -> Observable<[Repository]> in .flatMapLatest { query -> Observable<[Repository]> in
@ -96,7 +99,7 @@ let searchResults = searchBar.rx_text
<tr> <tr>
<td width="30%"><div class="highlight highlight-source-swift"><pre> <td width="30%"><div class="highlight highlight-source-swift"><pre>
searchResults searchResults
.bindTo(tableView.rx_itemsWithCellIdentifier("Cell")) { .bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
(index, repository: Repository, cell) in (index, repository: Repository, cell) in
cell.textLabel?.text = repository.name cell.textLabel?.text = repository.name
cell.detailTextLabel?.text = repository.url cell.detailTextLabel?.text = repository.url
@ -106,6 +109,16 @@ searchResults
</table> </table>
## Requirements
* Xcode 8.0 beta 6 (8S201h)
* Swift 3.0
* iOS 8.0+
* Mac OS X 10.10+
* tvOS 9.0+
* watchOS 2.0+
## Installation ## Installation
Rx doesn't contain any external dependencies. Rx doesn't contain any external dependencies.
@ -118,38 +131,48 @@ Open Rx.xcworkspace, choose `RxExample` and hit run. This method will build ever
### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)
**:warning: IMPORTANT! For tvOS support, CocoaPods `0.39` is required. :warning:**
``` ```
# Podfile # Podfile
use_frameworks! use_frameworks!
target 'YOUR_TARGET_NAME' do target 'YOUR_TARGET_NAME' do
pod 'RxSwift', '~> 2.0' pod 'RxSwift', '~> 3.0.0.alpha.1'
pod 'RxCocoa', '~> 2.0' pod 'RxCocoa', '~> 3.0.0.alpha.1'
end end
# RxTests and RxBlocking make the most sense in the context of unit/integration tests # RxTests and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do target 'YOUR_TESTING_TARGET' do
pod 'RxBlocking', '~> 2.0' pod 'RxBlocking', '~> 3.0.0.alpha.1'
pod 'RxTests', '~> 2.0' pod 'RxTests', '~> 3.0.0.alpha.1'
end end
``` ```
Replace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type: Replace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:
**:warning: If you want to use CocoaPods with Xcode 8.0 beta and Swift 3.0, you might need to add the following
lines to your podfile: :warning:**
```
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
end
end
end
```
``` ```
$ pod install $ pod install
``` ```
### [Carthage](https://github.com/Carthage/Carthage) ### [Carthage](https://github.com/Carthage/Carthage)
**Xcode 7.1 required**
Add this to `Cartfile` Add this to `Cartfile`
``` ```
github "ReactiveX/RxSwift" ~> 2.0 github "ReactiveX/RxSwift" "3.0.0.alpha.1"
``` ```
``` ```

View File

@ -22,7 +22,7 @@ example("startWith") {
.startWith("1") .startWith("1")
.startWith("2") .startWith("2")
.startWith("3", "🅰️", "🅱️") .startWith("3", "🅰️", "🅱️")
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -40,7 +40,7 @@ example("merge") {
Observable.of(subject1, subject2) Observable.of(subject1, subject2)
.merge() .merge()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
subject1.onNext("🅰️") subject1.onNext("🅰️")
@ -70,7 +70,7 @@ example("zip") {
Observable.zip(stringSubject, intSubject) { stringElement, intElement in Observable.zip(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)" "\(stringElement) \(intElement)"
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
stringSubject.onNext("🅰️") stringSubject.onNext("🅰️")
@ -98,7 +98,7 @@ example("combineLatest") {
Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)" "\(stringElement) \(intElement)"
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
stringSubject.onNext("🅰️") stringSubject.onNext("🅰️")
@ -115,13 +115,13 @@ example("Array.combineLatest") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
let stringObservable = Observable.just("❤️") let stringObservable = Observable.just("❤️")
let fruitObservable = ["🍎", "🍐", "🍊"].toObservable() let fruitObservable = Observable.from(["🍎", "🍐", "🍊"])
let animalObservable = Observable.of("🐶", "🐱", "🐭", "🐹") let animalObservable = Observable.of("🐶", "🐱", "🐭", "🐹")
[stringObservable, fruitObservable, animalObservable].combineLatest { [stringObservable, fruitObservable, animalObservable].combineLatest {
"\($0[0]) \($0[1]) \($0[2])" "\($0[0]) \($0[1]) \($0[2])"
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -141,7 +141,7 @@ example("switchLatest") {
variable.asObservable() variable.asObservable()
.switchLatest() .switchLatest()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
subject1.onNext("🏈") subject1.onNext("🏈")

View File

@ -23,11 +23,11 @@ func sampleWithoutConnectableOperators() {
let interval = Observable<Int>.interval(1, scheduler: MainScheduler.instance) let interval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
_ = interval _ = interval
.subscribeNext { print("Subscription: 1, Event: \($0)") } .subscribe(onNext: { print("Subscription: 1, Event: \($0)") })
delay(5) { delay(5) {
_ = interval _ = interval
.subscribeNext { print("Subscription: 2, Event: \($0)") } .subscribe(onNext: { print("Subscription: 2, Event: \($0)") })
} }
} }
@ -47,18 +47,18 @@ func sampleWithPublish() {
.publish() .publish()
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 1:, Event: \($0)") } .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
delay(2) { intSequence.connect() } delay(2) { _ = intSequence.connect() }
delay(4) { delay(4) {
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 2:, Event: \($0)") } .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
} }
delay(6) { delay(6) {
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 3:, Event: \($0)") } .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
} }
} }
@ -79,18 +79,18 @@ func sampleWithReplayBuffer() {
.replay(5) .replay(5)
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 1:, Event: \($0)") } .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
delay(2) { intSequence.connect() } delay(2) { _ = intSequence.connect() }
delay(4) { delay(4) {
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 2:, Event: \($0)") } .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
} }
delay(8) { delay(8) {
_ = intSequence _ = intSequence
.subscribeNext { print("Subscription 3:, Event: \($0)") } .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
} }
} }
@ -107,24 +107,24 @@ func sampleWithMulticast() {
let subject = PublishSubject<Int>() let subject = PublishSubject<Int>()
_ = subject _ = subject
.subscribeNext { print("Subject: \($0)") } .subscribe(onNext: { print("Subject: \($0)") })
let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance) let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.multicast(subject) .multicast(subject)
_ = intSequence _ = intSequence
.subscribeNext { print("\tSubscription 1:, Event: \($0)") } .subscribe(onNext: { print("\tSubscription 1:, Event: \($0)") })
delay(2) { intSequence.connect() } delay(2) { _ = intSequence.connect() }
delay(4) { delay(4) {
_ = intSequence _ = intSequence
.subscribeNext { print("\tSubscription 2:, Event: \($0)") } .subscribe(onNext: { print("\tSubscription 2:, Event: \($0)") })
} }
delay(6) { delay(6) {
_ = intSequence _ = intSequence
.subscribeNext { print("\tSubscription 3:, Event: \($0)") } .subscribe(onNext: { print("\tSubscription 3:, Event: \($0)") })
} }
} }

View File

@ -63,13 +63,13 @@ example("of") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
Observable.of("🐶", "🐱", "🐭", "🐹") Observable.of("🐶", "🐱", "🐭", "🐹")
.subscribeNext { element in .subscribe(onNext: { element in
print(element) print(element)
} })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
> This example also introduces using the `subscribeNext(_:)` convenience method. Unlike `subscribe(_:)`, which subscribes an _event_ handler for all event types (Next, Error, and Completed), `subscribeNext(_:)` subscribes an _element_ handler that will ignore Error and Completed events and only produce Next event elements. There are also `subscribeError(_:)` and `subscribeCompleted(_:)` convenience methods, should you only want to subscribe to those event types. And there is a `subscribe(onNext:onError:onCompleted:onDisposed:)` method, which allows you to react to one or more event types and when the subscription is terminated for any reason, or disposed, in a single call: > This example also introduces using the `subscribe(onNext:)` convenience method. Unlike `subscribe(_:)`, which subscribes an _event_ handler for all event types (Next, Error, and Completed), `subscribe(onNext:)` subscribes an _element_ handler that will ignore Error and Completed events and only produce Next event elements. There are also `subscribe(onError:)` and `subscribe(onCompleted:)` convenience methods, should you only want to subscribe to those event types. And there is a `subscribe(onNext:onError:onCompleted:onDisposed:)` method, which allows you to react to one or more event types and when the subscription is terminated for any reason, or disposed, in a single call:
``` ```
someObservable.subscribe( someObservable.subscribe(
onNext: { print("Element:", $0) }, onNext: { print("Element:", $0) },
@ -79,14 +79,14 @@ example("of") {
) )
``` ```
---- ----
## toObservable ## from
Creates an `Observable` sequence from a `SequenceType`, such as an `Array`, `Dictionary`, or `Set`. Creates an `Observable` sequence from a `SequenceType`, such as an `Array`, `Dictionary`, or `Set`.
*/ */
example("toObservable") { example("from") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
["🐶", "🐱", "🐭", "🐹"].toObservable() Observable.from(["🐶", "🐱", "🐭", "🐹"])
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -100,9 +100,9 @@ example("create") {
let myJust = { (element: String) -> Observable<String> in let myJust = { (element: String) -> Observable<String> in
return Observable.create { observer in return Observable.create { observer in
observer.on(.Next(element)) observer.on(.next(element))
observer.on(.Completed) observer.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
} }
@ -132,7 +132,7 @@ example("repeatElement") {
Observable.repeatElement("🔴") Observable.repeatElement("🔴")
.take(3) .take(3)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -149,7 +149,7 @@ example("generate") {
condition: { $0 < 3 }, condition: { $0 < 3 },
iterate: { $0 + 1 } iterate: { $0 + 1 }
) )
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -170,16 +170,16 @@ example("deferred") {
observer.onNext("🐶") observer.onNext("🐶")
observer.onNext("🐱") observer.onNext("🐱")
observer.onNext("🐵") observer.onNext("🐵")
return NopDisposable.instance return Disposables.create()
} }
} }
deferredSequence deferredSequence
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
deferredSequence deferredSequence
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -190,7 +190,7 @@ example("deferred") {
example("error") { example("error") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
Observable<Int>.error(Error.Test) Observable<Int>.error(TestError.test)
.subscribe { print($0) } .subscribe { print($0) }
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
@ -203,8 +203,8 @@ example("doOn") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
Observable.of("🍎", "🍐", "🍊", "🍋") Observable.of("🍎", "🍐", "🍊", "🍋")
.doOn { print("Intercepted:", $0) } .do(onNext: { print("Intercepted:", $0) }, onError: { print("Intercepted error:", $0) }, onCompleted: { print("Completed") })
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
//: > There are also `doOnNext(_:)`, `doOnError(_:)`, and `doOnCompleted(_:)` convenience methods to intercept those specific events, and `doOn(onNext:onError:onCompleted:)` to intercept one or more events in a single call. //: > There are also `doOnNext(_:)`, `doOnError(_:)`, and `doOnCompleted(_:)` convenience methods to intercept those specific events, and `doOn(onNext:onError:onCompleted:)` to intercept one or more events in a single call.

View File

@ -24,7 +24,7 @@ example("debug") {
observer.onNext("🍊") observer.onNext("🍊")
if count < 5 { if count < 5 {
observer.onError(Error.Test) observer.onError(TestError.test)
print("Error encountered") print("Error encountered")
count += 1 count += 1
} }
@ -34,13 +34,13 @@ example("debug") {
observer.onNext("🐭") observer.onNext("🐭")
observer.onCompleted() observer.onCompleted()
return NopDisposable.instance return Disposables.create()
} }
sequenceThatErrors sequenceThatErrors
.retry(3) .retry(3)
.debug() .debug()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -59,11 +59,11 @@ example("RxSwift.resourceCount") {
let variable = Variable("🍎") let variable = Variable("🍎")
let subscription1 = variable.asObservable().subscribeNext { print($0) } let subscription1 = variable.asObservable().subscribe(onNext: { print($0) })
print(RxSwift.resourceCount) print(RxSwift.resourceCount)
let subscription2 = variable.asObservable().subscribeNext { print($0) } let subscription2 = variable.asObservable().subscribe(onNext: { print($0) })
print(RxSwift.resourceCount) print(RxSwift.resourceCount)
@ -80,4 +80,4 @@ print(RxSwift.resourceCount)
#endif #endif
//: > `RxSwift.resourceCount` is not enabled by default, and should generally not be enabled in Release builds. [Click here](Enable_RxSwift.resourceCount) for instructions on how to enable it. //: > `RxSwift.resourceCount` is not enabled by default, and should generally not be enabled in Release builds. [Click here](Enable_RxSwift.resourceCount) for instructions on how to enable it.
//: [Table of Contents](Table_of_Contents) //: [Next](@next) - [Table of Contents](Table_of_Contents)

View File

@ -29,7 +29,7 @@ example("catchErrorJustReturn") {
sequenceThatFails.onNext("😨") sequenceThatFails.onNext("😨")
sequenceThatFails.onNext("😡") sequenceThatFails.onNext("😡")
sequenceThatFails.onNext("🔴") sequenceThatFails.onNext("🔴")
sequenceThatFails.onError(Error.Test) sequenceThatFails.onError(TestError.test)
} }
/*: /*:
---- ----
@ -55,7 +55,7 @@ example("catchError") {
sequenceThatFails.onNext("😨") sequenceThatFails.onNext("😨")
sequenceThatFails.onNext("😡") sequenceThatFails.onNext("😡")
sequenceThatFails.onNext("🔴") sequenceThatFails.onNext("🔴")
sequenceThatFails.onError(Error.Test) sequenceThatFails.onError(TestError.test)
recoverySequence.onNext("😊") recoverySequence.onNext("😊")
} }
@ -75,7 +75,7 @@ example("retry") {
observer.onNext("🍊") observer.onNext("🍊")
if count == 1 { if count == 1 {
observer.onError(Error.Test) observer.onError(TestError.test)
print("Error encountered") print("Error encountered")
count += 1 count += 1
} }
@ -85,12 +85,12 @@ example("retry") {
observer.onNext("🐭") observer.onNext("🐭")
observer.onCompleted() observer.onCompleted()
return NopDisposable.instance return Disposables.create()
} }
sequenceThatErrors sequenceThatErrors
.retry() .retry()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -109,7 +109,7 @@ example("retry maxAttemptCount") {
observer.onNext("🍊") observer.onNext("🍊")
if count < 5 { if count < 5 {
observer.onError(Error.Test) observer.onError(TestError.test)
print("Error encountered") print("Error encountered")
count += 1 count += 1
} }
@ -119,12 +119,12 @@ example("retry maxAttemptCount") {
observer.onNext("🐭") observer.onNext("🐭")
observer.onCompleted() observer.onCompleted()
return NopDisposable.instance return Disposables.create()
} }
sequenceThatErrors sequenceThatErrors
.retry(3) .retry(3)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }

View File

@ -25,7 +25,7 @@ example("filter") {
.filter { .filter {
$0 == "🐱" $0 == "🐱"
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -39,7 +39,7 @@ example("distinctUntilChanged") {
Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱") Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
.distinctUntilChanged() .distinctUntilChanged()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -53,7 +53,7 @@ example("elementAt") {
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.elementAt(3) .elementAt(3)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -66,7 +66,7 @@ example("single") {
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.single() .single()
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
@ -99,7 +99,7 @@ example("take") {
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.take(3) .take(3)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -113,7 +113,7 @@ example("takeLast") {
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.takeLast(3) .takeLast(3)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -127,7 +127,7 @@ example("takeWhile") {
Observable.of(1, 2, 3, 4, 5, 6) Observable.of(1, 2, 3, 4, 5, 6)
.takeWhile { $0 < 4 } .takeWhile { $0 < 4 }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -168,7 +168,7 @@ example("skip") {
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵") Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
.skip(2) .skip(2)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -182,7 +182,7 @@ example("skipWhile") {
Observable.of(1, 2, 3, 4, 5, 6) Observable.of(1, 2, 3, 4, 5, 6)
.skipWhile { $0 < 4 } .skipWhile { $0 < 4 }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -197,7 +197,7 @@ example("skipWhileWithIndex") {
.skipWhileWithIndex { element, index in .skipWhileWithIndex { element, index in
index < 3 index < 3
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -214,7 +214,7 @@ example("skipUntil") {
sourceSequence sourceSequence
.skipUntil(referenceSequence) .skipUntil(referenceSequence)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
sourceSequence.onNext("🐱") sourceSequence.onNext("🐱")

View File

@ -7,7 +7,9 @@
---- ----
[Previous](@previous) [Previous](@previous)
*/ */
import RxSwift import RxSwift
/*: /*:
# Introduction # Introduction
@ -30,11 +32,11 @@ All of these various systems makes our code needlessly complex. Wouldn't it be b
* `ObservableType.subscribe(_:)` takes an observer (`ObserverType`) parameter, which will be subscribed to automatically receive sequence events and elements emitted by the `Observable`, instead of manually calling `next()` on the returned generator. * `ObservableType.subscribe(_:)` takes an observer (`ObserverType`) parameter, which will be subscribed to automatically receive sequence events and elements emitted by the `Observable`, instead of manually calling `next()` on the returned generator.
*/ */
/*: /*:
If an `Observable` emits a Next event (`Event.Next(Element)`), it can continue to emit more events. However, if the `Observable` emits either an Error event (`Event.Error(ErrorType)`) or a Completed event (`Event.Completed`), the `Observable` sequence cannot emit additional events to the subscriber. If an `Observable` emits a next event (`Event.next(Element)`), it can continue to emit more events. However, if the `Observable` emits either an error event (`Event.error(ErrorType)`) or a completed event (`Event.completed`), the `Observable` sequence cannot emit additional events to the subscriber.
Sequence grammar explains this more concisely: Sequence grammar explains this more concisely:
`Next* (Error | Completed)?` `next* (error | completed)?`
And this can also be explained more visually using diagrams: And this can also be explained more visually using diagrams:
@ -44,7 +46,7 @@ All of these various systems makes our code needlessly complex. Wouldn't it be b
`--tap--tap----------tap--> // "|" = Continues indefinitely, such as a sequence of button taps` `--tap--tap----------tap--> // "|" = Continues indefinitely, such as a sequence of button taps`
> These diagrams are call marble diagrams. You can learn more about them at [RxMarbles.com](http://rxmarbles.com). > These diagrams are called marble diagrams. You can learn more about them at [RxMarbles.com](http://rxmarbles.com).
*/ */
/*: /*:
### Observables and observers (aka subscribers) ### Observables and observers (aka subscribers)
@ -54,9 +56,9 @@ All of these various systems makes our code needlessly complex. Wouldn't it be b
example("Observable with no subscribers") { example("Observable with no subscribers") {
_ = Observable<String>.create { observerOfString -> Disposable in _ = Observable<String>.create { observerOfString -> Disposable in
print("This will never be printed") print("This will never be printed")
observerOfString.on(.Next("😬")) observerOfString.on(.next("😬"))
observerOfString.on(.Completed) observerOfString.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
} }
/*: /*:
@ -64,11 +66,11 @@ example("Observable with no subscribers") {
In the following example, the closure will be executed when `subscribe(_:)` is called: In the following example, the closure will be executed when `subscribe(_:)` is called:
*/ */
example("Observable with subscriber") { example("Observable with subscriber") {
_ = Observable<String>.create { observerOfString in _ = Observable<String>.create { observerOfString in
print("Observable created") print("Observable created")
observerOfString.on(.Next("😉")) observerOfString.on(.next("😉"))
observerOfString.on(.Completed) observerOfString.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
.subscribe { event in .subscribe { event in
print(event) print(event)

View File

@ -34,7 +34,7 @@ example("reduce") {
Observable.of(10, 100, 1000) Observable.of(10, 100, 1000)
.reduce(1, accumulator: +) .reduce(1, accumulator: +)
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:

View File

@ -19,7 +19,7 @@ example("map") {
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
Observable.of(1, 2, 3) Observable.of(1, 2, 3)
.map { $0 * $0 } .map { $0 * $0 }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }
/*: /*:
@ -42,7 +42,7 @@ example("flatMap and flatMapLatest") {
player.asObservable() player.asObservable()
.flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output .flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
👦🏻.score.value = 85 👦🏻.score.value = 85
@ -71,7 +71,7 @@ example("scan") {
.scan(1) { aggregateValue, newValue in .scan(1) { aggregateValue, newValue in
aggregateValue + newValue aggregateValue + newValue
} }
.subscribeNext { print($0) } .subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag) .addDisposableTo(disposeBag)
} }

View File

@ -18,7 +18,7 @@ extension ObservableType {
Add observer with `id` and print each emitted event. Add observer with `id` and print each emitted event.
- parameter id: an identifier for the subscription. - parameter id: an identifier for the subscription.
*/ */
func addObserver(id: String) -> Disposable { func addObserver(_ id: String) -> Disposable {
return subscribe { print("Subscription:", id, "Event:", $0) } return subscribe { print("Subscription:", id, "Event:", $0) }
} }
@ -47,7 +47,7 @@ example("PublishSubject") {
subject.onNext("🅱️") subject.onNext("🅱️")
} }
/*: /*:
> This example also introduces using the `onNext(_:)` convenience method, equivalent to `on(.Next(_:)`, which causes a new Next event to be emitted to subscribers with the provided `element`. There are also `onError(_:)` and `onCompleted()` convenience methods, equivalent to `on(.Error(_:))` and `on(.Completed)`, respectively. > This example also introduces using the `onNext(_:)` convenience method, equivalent to `on(.next(_:)`, which causes a new Next event to be emitted to subscribers with the provided `element`. There are also `onError(_:)` and `onCompleted()` convenience methods, equivalent to `on(.error(_:))` and `on(.completed)`, respectively.
---- ----
## ReplaySubject ## ReplaySubject
Broadcasts new events to all subscribers, and the specified `bufferSize` number of previous events to new subscribers. Broadcasts new events to all subscribers, and the specified `bufferSize` number of previous events to new subscribers.

View File

@ -5,32 +5,31 @@ import Foundation
- parameter description: example description - parameter description: example description
- parameter action: `Void` closure - parameter action: `Void` closure
*/ */
public func example(description: String, @noescape action: Void -> Void) { public func example(_ description: String, action: (Void) -> Void) {
printExampleHeader(description) printExampleHeader(description)
action() action()
} }
public func printExampleHeader(description: String) { public func printExampleHeader(_ description: String) {
print("\n--- \(description) example ---") print("\n--- \(description) example ---")
} }
public enum Error: ErrorType { public enum TestError: Swift.Error {
case Test case test
} }
/** /**
Executes `closure` on main thread after `delay` seconds. Executes `closure` on main thread after `delay` seconds.
- parameter delay: time in seconds to wait before executing `closure` - parameter delay: time in seconds to wait before executing `closure`
- parameter closure: `Void` closure - parameter closure: `Void` closure
*/ */
public func delay(delay: Double, closure: Void -> Void) { public func delay(_ delay: Double, closure: @escaping (Void) -> Void) {
dispatch_after(
dispatch_time( let delayTime = DispatchTime.now() + DispatchTimeInterval.seconds(Int(delay))
DISPATCH_TIME_NOW, DispatchQueue.main.asyncAfter(deadline: delayTime) {
Int64(delay * Double(NSEC_PER_SEC)) closure()
), }
dispatch_get_main_queue(),
closure)
} }
#if NOT_IN_PLAYGROUND #if NOT_IN_PLAYGROUND
@ -39,10 +38,10 @@ public func delay(delay: Double, closure: Void -> Void) {
#else #else
import XCPlayground import PlaygroundSupport
public func playgroundShouldContinueIndefinitely() { public func playgroundShouldContinueIndefinitely() {
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true PlaygroundPage.current.needsIndefiniteExecution = true
} }
#endif #endif

View File

@ -0,0 +1,12 @@
[
{
"file": "/Users/mo/Documents/OpenSource/RxSwift/Rx.playground/Sources/SupportCode.swift",
"offset": 276,
"remove": 9,
},
{
"file": "/Users/mo/Documents/OpenSource/RxSwift/Rx.playground/Sources/SupportCode.swift",
"offset": 733,
"text": "@escaping ",
}
]

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='6.0' target-platform='osx' display-mode='rendered'> <playground version='6.0' target-platform='osx' display-mode='raw' last-migration='0800'>
<pages> <pages>
<page name='Table_of_Contents'/> <page name='Table_of_Contents'/>
<page name='Introduction'/> <page name='Introduction'/>

View File

@ -66,6 +66,7 @@
84E4D3931C9AFD3500ADFDC9 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E4D3901C9AFCD500ADFDC9 /* UISearchController+Rx.swift */; }; 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 */; }; 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 */; }; 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 */; }; 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 */; }; 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 */; }; 88718D011CE5DE2600D88D60 /* UITabBar+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88718D001CE5DE2500D88D60 /* UITabBar+RxTests.swift */; };
@ -121,8 +122,6 @@
C8093CDE1B8A72BE0088E94D /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; }; C8093CDE1B8A72BE0088E94D /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; };
C8093CDF1B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; C8093CDF1B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; };
C8093CE01B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; C8093CE01B8A72BE0088E94D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; };
C8093CE11B8A72BE0088E94D /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; };
C8093CE21B8A72BE0088E94D /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; };
C8093CE51B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; C8093CE51B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; };
C8093CE61B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; C8093CE61B8A72BE0088E94D /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; };
C8093CE71B8A72BE0088E94D /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; }; C8093CE71B8A72BE0088E94D /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; };
@ -139,8 +138,8 @@
C8093CF61B8A72BE0088E94D /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; }; C8093CF61B8A72BE0088E94D /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; };
C8093CF71B8A72BE0088E94D /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; }; C8093CF71B8A72BE0088E94D /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; };
C8093CF81B8A72BE0088E94D /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; }; C8093CF81B8A72BE0088E94D /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; };
C8093CFB1B8A72BE0088E94D /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */; }; C8093CFB1B8A72BE0088E94D /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */; };
C8093CFC1B8A72BE0088E94D /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */; }; C8093CFC1B8A72BE0088E94D /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */; };
C8093CFD1B8A72BE0088E94D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; }; C8093CFD1B8A72BE0088E94D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; };
C8093CFE1B8A72BE0088E94D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; }; C8093CFE1B8A72BE0088E94D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; };
C8093CFF1B8A72BE0088E94D /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C6B1B8A72BE0088E94D /* Amb.swift */; }; C8093CFF1B8A72BE0088E94D /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C6B1B8A72BE0088E94D /* Amb.swift */; };
@ -352,6 +351,10 @@
C80DDEB21BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; }; C80DDEB21BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; };
C80DDEB31BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; }; C80DDEB31BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; };
C80DDEB41BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; }; C80DDEB41BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */; };
C80EEC341D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */; };
C80EEC351D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */; };
C80EEC361D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */; };
C80EEC371D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */; };
C811C89D1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; }; C811C89D1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; };
C811C89E1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; }; C811C89E1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; };
C811C89F1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; }; C811C89F1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */; };
@ -367,7 +370,6 @@
C83100661BF7D51600AAE3CD /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83100631BF7D51600AAE3CD /* Sequence.swift */; }; C83100661BF7D51600AAE3CD /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83100631BF7D51600AAE3CD /* Sequence.swift */; };
C83100671BF7D51600AAE3CD /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83100631BF7D51600AAE3CD /* Sequence.swift */; }; C83100671BF7D51600AAE3CD /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83100631BF7D51600AAE3CD /* Sequence.swift */; };
C83508C81C386F6F0027C24C /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C8A56AD71AD7424700B4673B /* RxSwift.framework */; }; C83508C81C386F6F0027C24C /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C8A56AD71AD7424700B4673B /* RxSwift.framework */; };
C83509271C38706E0027C24C /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C83508D51C38706D0027C24C /* Info.plist */; };
C83509291C38706E0027C24C /* PerformanceTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508D71C38706D0027C24C /* PerformanceTools.swift */; }; C83509291C38706E0027C24C /* PerformanceTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508D71C38706D0027C24C /* PerformanceTools.swift */; };
C835092A1C38706E0027C24C /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508D91C38706D0027C24C /* CLLocationManager+RxTests.swift */; }; C835092A1C38706E0027C24C /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508D91C38706D0027C24C /* CLLocationManager+RxTests.swift */; };
C835092C1C38706E0027C24C /* Control+RxTests+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508DB1C38706D0027C24C /* Control+RxTests+UIKit.swift */; }; C835092C1C38706E0027C24C /* Control+RxTests+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83508DB1C38706D0027C24C /* Control+RxTests+UIKit.swift */; };
@ -555,6 +557,8 @@
C8350A231C38756B0027C24C /* VirtualSchedulerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C835091C1C38706D0027C24C /* VirtualSchedulerTest.swift */; }; C8350A231C38756B0027C24C /* VirtualSchedulerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C835091C1C38706D0027C24C /* VirtualSchedulerTest.swift */; };
C8350A2A1C3875B50027C24C /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */; }; C8350A2A1C3875B50027C24C /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */; };
C8350A2B1C3875B60027C24C /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */; }; C8350A2B1C3875B60027C24C /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */; };
C8379EF41D1DD326003EF8FC /* UIButton+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8379EF31D1DD326003EF8FC /* UIButton+RxTests.swift */; };
C8379EF51D1DD326003EF8FC /* UIButton+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8379EF31D1DD326003EF8FC /* UIButton+RxTests.swift */; };
C839365F1C70E02200A9A09E /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C839365E1C70E02200A9A09E /* UIApplication+Rx.swift */; }; C839365F1C70E02200A9A09E /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C839365E1C70E02200A9A09E /* UIApplication+Rx.swift */; };
C83D73B81C1DBAEE003DC470 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */; }; C83D73B81C1DBAEE003DC470 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */; };
C83D73B91C1DBAEE003DC470 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */; }; C83D73B91C1DBAEE003DC470 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */; };
@ -629,6 +633,9 @@
C86409FD1BA593F500D3C4E8 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86409FB1BA593F500D3C4E8 /* Range.swift */; }; C86409FD1BA593F500D3C4E8 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86409FB1BA593F500D3C4E8 /* Range.swift */; };
C8640A031BA5B12A00D3C4E8 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8640A021BA5B12A00D3C4E8 /* Repeat.swift */; }; C8640A031BA5B12A00D3C4E8 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8640A021BA5B12A00D3C4E8 /* Repeat.swift */; };
C8640A041BA5B12A00D3C4E8 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8640A021BA5B12A00D3C4E8 /* Repeat.swift */; }; C8640A041BA5B12A00D3C4E8 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8640A021BA5B12A00D3C4E8 /* Repeat.swift */; };
C86B1E221D42BF5200130546 /* SchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86B1E211D42BF5200130546 /* SchedulerTests.swift */; };
C86B1E231D42BF5200130546 /* SchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86B1E211D42BF5200130546 /* SchedulerTests.swift */; };
C86B1E241D42BF5200130546 /* SchedulerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86B1E211D42BF5200130546 /* SchedulerTests.swift */; };
C88254161B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */; }; C88254161B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */; };
C88254171B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */; }; C88254171B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */; };
C88254181B8A752B00B02D69 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F41B8A752B00B02D69 /* ItemEvents.swift */; }; C88254181B8A752B00B02D69 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F41B8A752B00B02D69 /* ItemEvents.swift */; };
@ -661,10 +668,10 @@
C88E296C1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; }; C88E296C1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; };
C88E296D1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; }; C88E296D1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; };
C88E296E1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; }; C88E296E1BEB712E001CCB92 /* RunLoopLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88E296A1BEB712E001CCB92 /* RunLoopLock.swift */; };
C88F76811CE5341700D5A014 /* RxTextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* RxTextInput.swift */; }; C88F76811CE5341700D5A014 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* TextInput.swift */; };
C88F76821CE5341700D5A014 /* RxTextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* RxTextInput.swift */; }; C88F76821CE5341700D5A014 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* TextInput.swift */; };
C88F76831CE5341700D5A014 /* RxTextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* RxTextInput.swift */; }; C88F76831CE5341700D5A014 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* TextInput.swift */; };
C88F76841CE5341700D5A014 /* RxTextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* RxTextInput.swift */; }; C88F76841CE5341700D5A014 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88F76801CE5341700D5A014 /* TextInput.swift */; };
C8941BDF1BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; }; C8941BDF1BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; };
C8941BE01BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; }; C8941BE01BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; };
C8941BE11BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; }; C8941BE11BD5695C00A0E874 /* BlockingObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8941BDE1BD5695C00A0E874 /* BlockingObservable.swift */; };
@ -802,6 +809,9 @@
C8E7B36A1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; }; C8E7B36A1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; };
C8E7B36B1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; }; C8E7B36B1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; };
C8E7B36C1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; }; C8E7B36C1C30C6B800B34368 /* TestableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E7B3681C30C6B800B34368 /* TestableObservable.swift */; };
C8E9E42B1D43B26C0049644E /* Observable+DebugTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E9E42A1D43B26C0049644E /* Observable+DebugTest.swift */; };
C8E9E42C1D43B26C0049644E /* Observable+DebugTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E9E42A1D43B26C0049644E /* Observable+DebugTest.swift */; };
C8E9E42D1D43B26C0049644E /* Observable+DebugTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E9E42A1D43B26C0049644E /* Observable+DebugTest.swift */; };
C8F0BF921BBBFB8B001B112F /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C981B8A72BE0088E94D /* Observable+Creation.swift */; }; C8F0BF921BBBFB8B001B112F /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C981B8A72BE0088E94D /* Observable+Creation.swift */; };
C8F0BF931BBBFB8B001B112F /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C4D1B8A72BE0088E94D /* ConnectableObservableType.swift */; }; C8F0BF931BBBFB8B001B112F /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C4D1B8A72BE0088E94D /* ConnectableObservableType.swift */; };
C8F0BF941BBBFB8B001B112F /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3DA021B9390C4004D233E /* Just.swift */; }; C8F0BF941BBBFB8B001B112F /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3DA021B9390C4004D233E /* Just.swift */; };
@ -825,7 +835,7 @@
C8F0BFA61BBBFB8B001B112F /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CC01B8A72BE0088E94D /* ReplaySubject.swift */; }; C8F0BFA61BBBFB8B001B112F /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CC01B8A72BE0088E94D /* ReplaySubject.swift */; };
C8F0BFA71BBBFB8B001B112F /* Zip+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3D9FD1B935EDF004D233E /* Zip+CollectionType.swift */; }; C8F0BFA71BBBFB8B001B112F /* Zip+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3D9FD1B935EDF004D233E /* Zip+CollectionType.swift */; };
C8F0BFA81BBBFB8B001B112F /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C9D1B8A72BE0088E94D /* Observable+Time.swift */; }; C8F0BFA81BBBFB8B001B112F /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C9D1B8A72BE0088E94D /* Observable+Time.swift */; };
C8F0BFA91BBBFB8B001B112F /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */; }; C8F0BFA91BBBFB8B001B112F /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */; };
C8F0BFAA1BBBFB8B001B112F /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C901B8A72BE0088E94D /* Throttle.swift */; }; C8F0BFAA1BBBFB8B001B112F /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C901B8A72BE0088E94D /* Throttle.swift */; };
C8F0BFAC1BBBFB8B001B112F /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C6E1B8A72BE0088E94D /* Catch.swift */; }; C8F0BFAC1BBBFB8B001B112F /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C6E1B8A72BE0088E94D /* Catch.swift */; };
C8F0BFAD1BBBFB8B001B112F /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C711B8A72BE0088E94D /* CombineLatest.swift */; }; C8F0BFAD1BBBFB8B001B112F /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C711B8A72BE0088E94D /* CombineLatest.swift */; };
@ -896,7 +906,6 @@
C8F0BFF21BBBFB8B001B112F /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CAB1B8A72BE0088E94D /* ObserverType.swift */; }; C8F0BFF21BBBFB8B001B112F /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CAB1B8A72BE0088E94D /* ObserverType.swift */; };
C8F0BFF31BBBFB8B001B112F /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C8B1B8A72BE0088E94D /* SubscribeOn.swift */; }; C8F0BFF31BBBFB8B001B112F /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C8B1B8A72BE0088E94D /* SubscribeOn.swift */; };
C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; }; C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; };
C8F0BFF51BBBFB8B001B112F /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; };
C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; }; C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; };
C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3DA0B1B93959F004D233E /* Never.swift */; }; C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C3DA0B1B93959F004D233E /* Never.swift */; };
C8F0BFF91BBBFB8B001B112F /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; }; C8F0BFF91BBBFB8B001B112F /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; };
@ -987,10 +996,6 @@
CB30D9EA1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; }; CB30D9EA1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; };
CB30D9EB1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; }; CB30D9EB1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; };
CB30D9EC1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; }; CB30D9EC1BF0E3500084C1C0 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */; };
CB832B331D19654700C27230 /* NSProgressIndicator+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB832B311D1964E300C27230 /* NSProgressIndicator+Rx.swift */; };
CB832B371D19669100C27230 /* RxTextFieldDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB832B361D19669100C27230 /* RxTextFieldDelegateProxy.swift */; };
CB832B391D19673900C27230 /* NSTextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB832B381D19673900C27230 /* NSTextView+Rx.swift */; };
CB832B3B1D1967A900C27230 /* RxTextViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB832B3A1D1967A900C27230 /* RxTextViewDelegateProxy.swift */; };
CB883B3B1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; }; CB883B3B1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; };
CB883B3C1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; }; CB883B3C1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; };
CB883B3D1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; }; CB883B3D1BE24355000AC2EE /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB883B3A1BE24355000AC2EE /* Window.swift */; };
@ -1011,6 +1016,10 @@
CBEE77201BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; CBEE77201BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; };
CBEE77211BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; CBEE77211BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; };
CBEE77221BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; }; CBEE77221BD649A000AD584C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE771E1BD649A000AD584C /* ToArray.swift */; };
CDDEF16A1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; };
CDDEF16B1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; };
CDDEF16C1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; };
CDDEF16D1D4FB40000CA8546 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDEF1691D4FB40000CA8546 /* Disposables.swift */; };
D203C4F31BB9C4CA00D02D00 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */; }; D203C4F31BB9C4CA00D02D00 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */; };
D203C4F41BB9C52400D02D00 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */; }; D203C4F41BB9C52400D02D00 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */; };
D203C4F51BB9C52900D02D00 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F41B8A752B00B02D69 /* ItemEvents.swift */; }; D203C4F51BB9C52900D02D00 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88253F41B8A752B00B02D69 /* ItemEvents.swift */; };
@ -1082,7 +1091,7 @@
D2EBEAE01BB9B697003A27DC /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; }; D2EBEAE01BB9B697003A27DC /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C641B8A72BE0088E94D /* Event.swift */; };
D2EBEAE11BB9B697003A27DC /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; }; D2EBEAE11BB9B697003A27DC /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */; };
D2EBEAE21BB9B697003A27DC /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; }; D2EBEAE21BB9B697003A27DC /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C681B8A72BE0088E94D /* Observable.swift */; };
D2EBEAE31BB9B697003A27DC /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */; }; D2EBEAE31BB9B697003A27DC /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */; };
D2EBEAE41BB9B697003A27DC /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C9E1B8A72BE0088E94D /* ObservableType.swift */; }; D2EBEAE41BB9B697003A27DC /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C9E1B8A72BE0088E94D /* ObservableType.swift */; };
D2EBEAE51BB9B697003A27DC /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CA01B8A72BE0088E94D /* AnyObserver.swift */; }; D2EBEAE51BB9B697003A27DC /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CA01B8A72BE0088E94D /* AnyObserver.swift */; };
D2EBEAE61BB9B697003A27DC /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CAB1B8A72BE0088E94D /* ObserverType.swift */; }; D2EBEAE61BB9B697003A27DC /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093CAB1B8A72BE0088E94D /* ObserverType.swift */; };
@ -1099,7 +1108,6 @@
D2EBEAF21BB9B6AE003A27DC /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */; }; D2EBEAF21BB9B6AE003A27DC /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */; };
D2EBEAF31BB9B6AE003A27DC /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; }; D2EBEAF31BB9B6AE003A27DC /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C581B8A72BE0088E94D /* DisposeBag.swift */; };
D2EBEAF41BB9B6AE003A27DC /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; }; D2EBEAF41BB9B6AE003A27DC /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C591B8A72BE0088E94D /* DisposeBase.swift */; };
D2EBEAF51BB9B6AE003A27DC /* NAryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */; };
D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; }; D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */; };
D2EBEAF71BB9B6B2003A27DC /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; }; D2EBEAF71BB9B6B2003A27DC /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */; };
D2EBEAF91BB9B6B2003A27DC /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; }; D2EBEAF91BB9B6B2003A27DC /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */; };
@ -1408,9 +1416,9 @@
84C225A21C33F00B008724EC /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextStorageDelegateProxy.swift; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 9BA1CBD11C0F7C0A0044B50A /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIActivityIndicatorView+Rx.swift"; sourceTree = "<group>"; };
@ -1436,8 +1444,6 @@
C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositeDisposable.swift; sourceTree = "<group>"; }; C8093C571B8A72BE0088E94D /* CompositeDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositeDisposable.swift; sourceTree = "<group>"; };
C8093C581B8A72BE0088E94D /* DisposeBag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBag.swift; sourceTree = "<group>"; }; C8093C581B8A72BE0088E94D /* DisposeBag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBag.swift; sourceTree = "<group>"; };
C8093C591B8A72BE0088E94D /* DisposeBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBase.swift; sourceTree = "<group>"; }; C8093C591B8A72BE0088E94D /* DisposeBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposeBase.swift; sourceTree = "<group>"; };
C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NAryDisposable.swift; sourceTree = "<group>"; };
C8093C5B1B8A72BE0088E94D /* NAryDisposable.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NAryDisposable.tt; sourceTree = "<group>"; };
C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NopDisposable.swift; sourceTree = "<group>"; }; C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NopDisposable.swift; sourceTree = "<group>"; };
C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledDisposable.swift; sourceTree = "<group>"; }; C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduledDisposable.swift; sourceTree = "<group>"; };
C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SerialDisposable.swift; sourceTree = "<group>"; }; C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SerialDisposable.swift; sourceTree = "<group>"; };
@ -1447,7 +1453,7 @@
C8093C641B8A72BE0088E94D /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = "<group>"; }; C8093C641B8A72BE0088E94D /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = "<group>"; };
C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImmediateSchedulerType.swift; sourceTree = "<group>"; }; C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImmediateSchedulerType.swift; sourceTree = "<group>"; };
C8093C661B8A72BE0088E94D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; C8093C661B8A72BE0088E94D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+Extensions.swift"; sourceTree = "<group>"; }; C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "ObservableType+Extensions.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8093C681B8A72BE0088E94D /* Observable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = "<group>"; }; C8093C681B8A72BE0088E94D /* Observable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = "<group>"; };
C8093C6B1B8A72BE0088E94D /* Amb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Amb.swift; sourceTree = "<group>"; }; C8093C6B1B8A72BE0088E94D /* Amb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Amb.swift; sourceTree = "<group>"; };
C8093C6E1B8A72BE0088E94D /* Catch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Catch.swift; sourceTree = "<group>"; }; C8093C6E1B8A72BE0088E94D /* Catch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Catch.swift; sourceTree = "<group>"; };
@ -1455,7 +1461,7 @@
C8093C701B8A72BE0088E94D /* CombineLatest+arity.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "CombineLatest+arity.tt"; sourceTree = "<group>"; }; C8093C701B8A72BE0088E94D /* CombineLatest+arity.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "CombineLatest+arity.tt"; sourceTree = "<group>"; };
C8093C711B8A72BE0088E94D /* CombineLatest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CombineLatest.swift; sourceTree = "<group>"; }; C8093C711B8A72BE0088E94D /* CombineLatest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CombineLatest.swift; sourceTree = "<group>"; };
C8093C721B8A72BE0088E94D /* Concat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Concat.swift; sourceTree = "<group>"; }; C8093C721B8A72BE0088E94D /* Concat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Concat.swift; sourceTree = "<group>"; };
C8093C741B8A72BE0088E94D /* ConnectableObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectableObservable.swift; sourceTree = "<group>"; }; C8093C741B8A72BE0088E94D /* ConnectableObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ConnectableObservable.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8093C751B8A72BE0088E94D /* Debug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debug.swift; sourceTree = "<group>"; }; C8093C751B8A72BE0088E94D /* Debug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debug.swift; sourceTree = "<group>"; };
C8093C761B8A72BE0088E94D /* Deferred.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deferred.swift; sourceTree = "<group>"; }; C8093C761B8A72BE0088E94D /* Deferred.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deferred.swift; sourceTree = "<group>"; };
C8093C771B8A72BE0088E94D /* DelaySubscription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelaySubscription.swift; sourceTree = "<group>"; }; C8093C771B8A72BE0088E94D /* DelaySubscription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelaySubscription.swift; sourceTree = "<group>"; };
@ -1503,7 +1509,7 @@
C8093CAF1B8A72BE0088E94D /* Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rx.swift; sourceTree = "<group>"; }; C8093CAF1B8A72BE0088E94D /* Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Rx.swift; sourceTree = "<group>"; };
C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxMutableBox.swift; sourceTree = "<group>"; }; C8093CB01B8A72BE0088E94D /* RxMutableBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxMutableBox.swift; sourceTree = "<group>"; };
C8093CB31B8A72BE0088E94D /* SchedulerType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchedulerType.swift; sourceTree = "<group>"; }; C8093CB31B8A72BE0088E94D /* SchedulerType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchedulerType.swift; sourceTree = "<group>"; };
C8093CB51B8A72BE0088E94D /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConcurrentDispatchQueueScheduler.swift; sourceTree = "<group>"; }; C8093CB51B8A72BE0088E94D /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ConcurrentDispatchQueueScheduler.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8093CB71B8A72BE0088E94D /* MainScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainScheduler.swift; sourceTree = "<group>"; }; C8093CB71B8A72BE0088E94D /* MainScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainScheduler.swift; sourceTree = "<group>"; };
C8093CB81B8A72BE0088E94D /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationQueueScheduler.swift; sourceTree = "<group>"; }; C8093CB81B8A72BE0088E94D /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationQueueScheduler.swift; sourceTree = "<group>"; };
C8093CB91B8A72BE0088E94D /* RecursiveScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecursiveScheduler.swift; sourceTree = "<group>"; }; C8093CB91B8A72BE0088E94D /* RecursiveScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecursiveScheduler.swift; sourceTree = "<group>"; };
@ -1521,7 +1527,7 @@
C8093E861B8A732E0088E94D /* _RXKVOObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _RXKVOObserver.h; sourceTree = "<group>"; }; C8093E861B8A732E0088E94D /* _RXKVOObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _RXKVOObserver.h; sourceTree = "<group>"; };
C8093E871B8A732E0088E94D /* _RXKVOObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _RXKVOObserver.m; sourceTree = "<group>"; }; C8093E871B8A732E0088E94D /* _RXKVOObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _RXKVOObserver.m; sourceTree = "<group>"; };
C8093E8A1B8A732E0088E94D /* CLLocationManager+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CLLocationManager+Rx.swift"; sourceTree = "<group>"; }; C8093E8A1B8A732E0088E94D /* CLLocationManager+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CLLocationManager+Rx.swift"; sourceTree = "<group>"; };
C8093E8B1B8A732E0088E94D /* DelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelegateProxy.swift; sourceTree = "<group>"; }; C8093E8B1B8A732E0088E94D /* DelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = DelegateProxy.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8093E8C1B8A732E0088E94D /* DelegateProxyType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelegateProxyType.swift; sourceTree = "<group>"; }; C8093E8C1B8A732E0088E94D /* DelegateProxyType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelegateProxyType.swift; sourceTree = "<group>"; };
C8093E8D1B8A732E0088E94D /* Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; }; C8093E8D1B8A732E0088E94D /* Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; };
C8093E901B8A732E0088E94D /* ControlTarget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlTarget.swift; sourceTree = "<group>"; }; C8093E901B8A732E0088E94D /* ControlTarget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlTarget.swift; sourceTree = "<group>"; };
@ -1542,7 +1548,7 @@
C8093ECB1B8A732E0088E94D /* RxCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RxCocoa.h; sourceTree = "<group>"; }; C8093ECB1B8A732E0088E94D /* RxCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RxCocoa.h; sourceTree = "<group>"; };
C8093F581B8A73A20088E94D /* ObservableConvertibleType+Blocking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ObservableConvertibleType+Blocking.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C8093F581B8A73A20088E94D /* ObservableConvertibleType+Blocking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ObservableConvertibleType+Blocking.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8093F591B8A73A20088E94D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; }; C8093F591B8A73A20088E94D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
C80D338E1B91EF9E0014629D /* Observable+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+Bind.swift"; sourceTree = "<group>"; }; C80D338E1B91EF9E0014629D /* Observable+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "Observable+Bind.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C80D33931B922FB00014629D /* ControlEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlEvent.swift; sourceTree = "<group>"; }; C80D33931B922FB00014629D /* ControlEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlEvent.swift; sourceTree = "<group>"; };
C80D33941B922FB00014629D /* ControlProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ControlProperty.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C80D33941B922FB00014629D /* ControlProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ControlProperty.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C80D342D1B9245A40014629D /* CombineLatest+CollectionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "CombineLatest+CollectionType.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C80D342D1B9245A40014629D /* CombineLatest+CollectionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "CombineLatest+CollectionType.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
@ -1554,6 +1560,7 @@
C80DDE921BCE69BA006A1832 /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ObservableConvertibleType+Driver.swift"; sourceTree = "<group>"; }; C80DDE921BCE69BA006A1832 /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ObservableConvertibleType+Driver.swift"; sourceTree = "<group>"; };
C80DDEAB1BCE83B2006A1832 /* Driver+Operators+arity.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Driver+Operators+arity.tt"; sourceTree = "<group>"; }; C80DDEAB1BCE83B2006A1832 /* Driver+Operators+arity.tt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Driver+Operators+arity.tt"; sourceTree = "<group>"; };
C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Operators+arity.swift"; sourceTree = "<group>"; }; C80DDEB01BCE8CA3006A1832 /* Driver+Operators+arity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Operators+arity.swift"; sourceTree = "<group>"; };
C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DispatchQueueConfiguration.swift; sourceTree = "<group>"; };
C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeallocObservable.swift; sourceTree = "<group>"; }; C811C89C1C24D80100A2DDD4 /* DeallocObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeallocObservable.swift; sourceTree = "<group>"; };
C821DBA11BA4DCAB008F3809 /* Buffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buffer.swift; sourceTree = "<group>"; }; C821DBA11BA4DCAB008F3809 /* Buffer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buffer.swift; sourceTree = "<group>"; };
C83100631BF7D51600AAE3CD /* Sequence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sequence.swift; sourceTree = "<group>"; }; C83100631BF7D51600AAE3CD /* Sequence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sequence.swift; sourceTree = "<group>"; };
@ -1567,8 +1574,8 @@
C83508DC1C38706D0027C24C /* Control+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Control+RxTests.swift"; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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; path = "DelegateProxyTest+UIKit.swift"; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; C83508E31C38706D0027C24C /* Driver+Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Test.swift"; sourceTree = "<group>"; };
@ -1633,6 +1640,7 @@
C83509231C38706E0027C24C /* XCTest+AllTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTest+AllTests.swift"; sourceTree = "<group>"; }; C83509231C38706E0027C24C /* XCTest+AllTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTest+AllTests.swift"; sourceTree = "<group>"; };
C83509841C38740E0027C24C /* AllTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AllTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C83509841C38740E0027C24C /* AllTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AllTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
C83509941C38742C0027C24C /* AllTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AllTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C83509941C38742C0027C24C /* AllTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "AllTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
C8379EF31D1DD326003EF8FC /* UIButton+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIButton+RxTests.swift"; sourceTree = "<group>"; };
C839365E1C70E02200A9A09E /* UIApplication+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+Rx.swift"; sourceTree = "<group>"; }; C839365E1C70E02200A9A09E /* UIApplication+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+Rx.swift"; sourceTree = "<group>"; };
C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnonymousInvocable.swift; sourceTree = "<group>"; }; C83D73B31C1DBAEE003DC470 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnonymousInvocable.swift; sourceTree = "<group>"; };
C83D73B41C1DBAEE003DC470 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InvocableScheduledItem.swift; sourceTree = "<group>"; }; C83D73B41C1DBAEE003DC470 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InvocableScheduledItem.swift; sourceTree = "<group>"; };
@ -1654,37 +1662,38 @@
C85BA04B1C3878740075D68E /* PerformanceTests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PerformanceTests.app; sourceTree = BUILT_PRODUCTS_DIR; }; C85BA04B1C3878740075D68E /* PerformanceTests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PerformanceTests.app; sourceTree = BUILT_PRODUCTS_DIR; };
C86409FB1BA593F500D3C4E8 /* Range.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Range.swift; sourceTree = "<group>"; }; C86409FB1BA593F500D3C4E8 /* Range.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Range.swift; sourceTree = "<group>"; };
C8640A021BA5B12A00D3C4E8 /* Repeat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Repeat.swift; sourceTree = "<group>"; }; C8640A021BA5B12A00D3C4E8 /* Repeat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Repeat.swift; sourceTree = "<group>"; };
C86B1E211D42BF5200130546 /* SchedulerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchedulerTests.swift; sourceTree = "<group>"; };
C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewReactiveArrayDataSource.swift; sourceTree = "<group>"; }; C88253F11B8A752B00B02D69 /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxCollectionViewReactiveArrayDataSource.swift; sourceTree = "<group>"; };
C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewReactiveArrayDataSource.swift; sourceTree = "<group>"; }; C88253F21B8A752B00B02D69 /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTableViewReactiveArrayDataSource.swift; sourceTree = "<group>"; };
C88253F41B8A752B00B02D69 /* ItemEvents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemEvents.swift; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; path = RxSearchBarDelegateProxy.swift; sourceTree = "<group>"; }; 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; path = RxTableViewDataSourceProxy.swift; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; path = "UISearchBar+Rx.swift"; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; C88F76801CE5341700D5A014 /* TextInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextInput.swift; sourceTree = "<group>"; };
C88FA50C1C25C44800CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C88FA50C1C25C44800CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C88FA51D1C25C4B500CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C88FA51D1C25C4B500CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C88FA52E1C25C4C000CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C88FA52E1C25C4C000CCFEA4 /* RxTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@ -1710,13 +1719,14 @@
C8C3DA051B9393AC004D233E /* Empty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Empty.swift; sourceTree = "<group>"; }; C8C3DA051B9393AC004D233E /* Empty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Empty.swift; sourceTree = "<group>"; };
C8C3DA081B93941E004D233E /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; }; C8C3DA081B93941E004D233E /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
C8C3DA0B1B93959F004D233E /* Never.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Never.swift; sourceTree = "<group>"; }; C8C3DA0B1B93959F004D233E /* Never.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Never.swift; sourceTree = "<group>"; };
C8C3DA0E1B939767004D233E /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrentThreadScheduler.swift; sourceTree = "<group>"; }; C8C3DA0E1B939767004D233E /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = CurrentThreadScheduler.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8C3DA111B93A3EA004D233E /* AnonymousObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AnonymousObservable.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C8C3DA111B93A3EA004D233E /* AnonymousObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AnonymousObservable.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
C8C4B4A71C17722400828BD5 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _RXObjCRuntime.m; sourceTree = "<group>"; }; C8C4B4A71C17722400828BD5 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _RXObjCRuntime.m; sourceTree = "<group>"; };
C8C4B4A81C17722400828BD5 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _RXObjCRuntime.h; sourceTree = "<group>"; }; C8C4B4A81C17722400828BD5 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _RXObjCRuntime.h; sourceTree = "<group>"; };
C8C4B4C01C17727000828BD5 /* MessageSentObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageSentObserver.swift; sourceTree = "<group>"; }; C8C4B4C01C17727000828BD5 /* MessageSentObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageSentObserver.swift; sourceTree = "<group>"; };
C8D132431C42D15E00B59FFF /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedViewDataSourceType.swift; sourceTree = "<group>"; }; C8D132431C42D15E00B59FFF /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedViewDataSourceType.swift; sourceTree = "<group>"; };
C8D132521C42DA7F00B59FFF /* SectionedViewDataSourceMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedViewDataSourceMock.swift; sourceTree = "<group>"; }; C8D132521C42DA7F00B59FFF /* SectionedViewDataSourceMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedViewDataSourceMock.swift; sourceTree = "<group>"; };
C8D2C1501D4F3CD6006E2431 /* Rx.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Rx.playground; sourceTree = "<group>"; };
C8DB967D1BF7496C0084BD53 /* KVORepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KVORepresentable.swift; sourceTree = "<group>"; }; C8DB967D1BF7496C0084BD53 /* KVORepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KVORepresentable.swift; sourceTree = "<group>"; };
C8DB96821BF754C80084BD53 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Rx+KVORepresentable.swift"; sourceTree = "<group>"; }; C8DB96821BF754C80084BD53 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Rx+KVORepresentable.swift"; sourceTree = "<group>"; };
C8DB96871BF756F40084BD53 /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "KVORepresentable+CoreGraphics.swift"; sourceTree = "<group>"; }; C8DB96871BF756F40084BD53 /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "KVORepresentable+CoreGraphics.swift"; sourceTree = "<group>"; };
@ -1733,6 +1743,7 @@
C8E3A7301C2606A900643FE6 /* Event+Equatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Event+Equatable.swift"; sourceTree = "<group>"; }; C8E3A7301C2606A900643FE6 /* Event+Equatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Event+Equatable.swift"; sourceTree = "<group>"; };
C8E3A7351C26088C00643FE6 /* Any+Equatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Any+Equatable.swift"; sourceTree = "<group>"; }; C8E3A7351C26088C00643FE6 /* Any+Equatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Any+Equatable.swift"; sourceTree = "<group>"; };
C8E7B3681C30C6B800B34368 /* TestableObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestableObservable.swift; sourceTree = "<group>"; }; C8E7B3681C30C6B800B34368 /* TestableObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestableObservable.swift; sourceTree = "<group>"; };
C8E9E42A1D43B26C0049644E /* Observable+DebugTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+DebugTest.swift"; sourceTree = "<group>"; };
C8F0C0021BBBFB8B001B112F /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C8F0C0021BBBFB8B001B112F /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C8F0C04B1BBBFBB9001B112F /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C8F0C04B1BBBFBB9001B112F /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C8F0C0581BBBFBCE001B112F /* RxBlocking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxBlocking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C8F0C0581BBBFBCE001B112F /* RxBlocking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxBlocking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@ -1746,15 +1757,12 @@
C8FD21AD1C67E14C00863EC3 /* UIBindingObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIBindingObserver.swift; sourceTree = "<group>"; }; C8FD21AD1C67E14C00863EC3 /* UIBindingObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIBindingObserver.swift; sourceTree = "<group>"; };
CB255BD61BC46A9C00798A4C /* RetryWhen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetryWhen.swift; sourceTree = "<group>"; }; CB255BD61BC46A9C00798A4C /* RetryWhen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetryWhen.swift; sourceTree = "<group>"; };
CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleAsync.swift; sourceTree = "<group>"; }; CB30D9E81BF0E3500084C1C0 /* SingleAsync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleAsync.swift; sourceTree = "<group>"; };
CB832B311D1964E300C27230 /* NSProgressIndicator+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSProgressIndicator+Rx.swift"; sourceTree = "<group>"; };
CB832B361D19669100C27230 /* RxTextFieldDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextFieldDelegateProxy.swift; sourceTree = "<group>"; };
CB832B381D19673900C27230 /* NSTextView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSTextView+Rx.swift"; sourceTree = "<group>"; };
CB832B3A1D1967A900C27230 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxTextViewDelegateProxy.swift; sourceTree = "<group>"; };
CB883B3A1BE24355000AC2EE /* Window.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Window.swift; sourceTree = "<group>"; }; CB883B3A1BE24355000AC2EE /* Window.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Window.swift; sourceTree = "<group>"; };
CB883B3F1BE24C15000AC2EE /* RefCountDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefCountDisposable.swift; sourceTree = "<group>"; }; CB883B3F1BE24C15000AC2EE /* RefCountDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefCountDisposable.swift; sourceTree = "<group>"; };
CB883B441BE256D4000AC2EE /* BooleanDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BooleanDisposable.swift; sourceTree = "<group>"; }; CB883B441BE256D4000AC2EE /* BooleanDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BooleanDisposable.swift; sourceTree = "<group>"; };
CB883B491BE369AA000AC2EE /* AddRef.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddRef.swift; sourceTree = "<group>"; }; CB883B491BE369AA000AC2EE /* AddRef.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddRef.swift; sourceTree = "<group>"; };
CBEE771E1BD649A000AD584C /* ToArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToArray.swift; sourceTree = "<group>"; }; CBEE771E1BD649A000AD584C /* ToArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToArray.swift; sourceTree = "<group>"; };
CDDEF1691D4FB40000CA8546 /* Disposables.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Disposables.swift; sourceTree = "<group>"; };
D2138C751BB9BE9800339B5C /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D2138C751BB9BE9800339B5C /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D2245A1A1BD5657300E7146F /* WithLatestFrom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WithLatestFrom.swift; sourceTree = "<group>"; }; D2245A1A1BD5657300E7146F /* WithLatestFrom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WithLatestFrom.swift; sourceTree = "<group>"; };
D22B6D251BC8504A00BCE0AB /* SkipWhile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SkipWhile.swift; sourceTree = "<group>"; }; D22B6D251BC8504A00BCE0AB /* SkipWhile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SkipWhile.swift; sourceTree = "<group>"; };
@ -1924,7 +1932,7 @@
C8093C641B8A72BE0088E94D /* Event.swift */, C8093C641B8A72BE0088E94D /* Event.swift */,
C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */, C8093C651B8A72BE0088E94D /* ImmediateSchedulerType.swift */,
C8093C681B8A72BE0088E94D /* Observable.swift */, C8093C681B8A72BE0088E94D /* Observable.swift */,
C8093C671B8A72BE0088E94D /* Observable+Extensions.swift */, C8093C671B8A72BE0088E94D /* ObservableType+Extensions.swift */,
C849BE2A1BAB5D070019AD27 /* ObservableConvertibleType.swift */, C849BE2A1BAB5D070019AD27 /* ObservableConvertibleType.swift */,
C8093C9E1B8A72BE0088E94D /* ObservableType.swift */, C8093C9E1B8A72BE0088E94D /* ObservableType.swift */,
C8093CA01B8A72BE0088E94D /* AnyObserver.swift */, C8093CA01B8A72BE0088E94D /* AnyObserver.swift */,
@ -1980,14 +1988,13 @@
C8093C581B8A72BE0088E94D /* DisposeBag.swift */, C8093C581B8A72BE0088E94D /* DisposeBag.swift */,
C8093C591B8A72BE0088E94D /* DisposeBase.swift */, C8093C591B8A72BE0088E94D /* DisposeBase.swift */,
C84CC5661BDD08A500E06A64 /* SubscriptionDisposable.swift */, C84CC5661BDD08A500E06A64 /* SubscriptionDisposable.swift */,
C8093C5A1B8A72BE0088E94D /* NAryDisposable.swift */,
C8093C5B1B8A72BE0088E94D /* NAryDisposable.tt */,
C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */, C8093C5C1B8A72BE0088E94D /* NopDisposable.swift */,
CB883B3F1BE24C15000AC2EE /* RefCountDisposable.swift */, CB883B3F1BE24C15000AC2EE /* RefCountDisposable.swift */,
C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */, C8093C5D1B8A72BE0088E94D /* ScheduledDisposable.swift */,
C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */, C8093C5F1B8A72BE0088E94D /* SerialDisposable.swift */,
C8093C601B8A72BE0088E94D /* SingleAssignmentDisposable.swift */, C8093C601B8A72BE0088E94D /* SingleAssignmentDisposable.swift */,
C8093C611B8A72BE0088E94D /* StableCompositeDisposable.swift */, C8093C611B8A72BE0088E94D /* StableCompositeDisposable.swift */,
CDDEF1691D4FB40000CA8546 /* Disposables.swift */,
); );
path = Disposables; path = Disposables;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2161,7 +2168,7 @@
C8BCD3F31C14B6D1005F1280 /* NSLayoutConstraint+Rx.swift */, C8BCD3F31C14B6D1005F1280 /* NSLayoutConstraint+Rx.swift */,
C8D132431C42D15E00B59FFF /* SectionedViewDataSourceType.swift */, C8D132431C42D15E00B59FFF /* SectionedViewDataSourceType.swift */,
D2F461001CD7ABE400527B4D /* Reactive.swift */, D2F461001CD7ABE400527B4D /* Reactive.swift */,
C88F76801CE5341700D5A014 /* RxTextInput.swift */, C88F76801CE5341700D5A014 /* TextInput.swift */,
); );
path = Common; path = Common;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2202,14 +2209,11 @@
C8093EC51B8A732E0088E94D /* OSX */ = { C8093EC51B8A732E0088E94D /* OSX */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CB832B351D19667900C27230 /* Proxies */,
C8093EC61B8A732E0088E94D /* NSButton+Rx.swift */, C8093EC61B8A732E0088E94D /* NSButton+Rx.swift */,
C8093EC71B8A732E0088E94D /* NSControl+Rx.swift */, C8093EC71B8A732E0088E94D /* NSControl+Rx.swift */,
C8093EC81B8A732E0088E94D /* NSImageView+Rx.swift */, C8093EC81B8A732E0088E94D /* NSImageView+Rx.swift */,
CB832B311D1964E300C27230 /* NSProgressIndicator+Rx.swift */,
C8093EC91B8A732E0088E94D /* NSSlider+Rx.swift */, C8093EC91B8A732E0088E94D /* NSSlider+Rx.swift */,
C8093ECA1B8A732E0088E94D /* NSTextField+Rx.swift */, C8093ECA1B8A732E0088E94D /* NSTextField+Rx.swift */,
CB832B381D19673900C27230 /* NSTextView+Rx.swift */,
C8BCD3F11C14B62B005F1280 /* NSView+Rx.swift */, C8BCD3F11C14B62B005F1280 /* NSView+Rx.swift */,
); );
path = OSX; path = OSX;
@ -2322,6 +2326,7 @@
844BC8B71CE5023200F5C7CB /* UIPickerView+RxTests.swift */, 844BC8B71CE5023200F5C7CB /* UIPickerView+RxTests.swift */,
914FCD661CCDB82E0058B304 /* UIPageControl+RxTest.swift */, 914FCD661CCDB82E0058B304 /* UIPageControl+RxTest.swift */,
033C2EF41D081B2A0050C015 /* UIScrollView+RxTests.swift */, 033C2EF41D081B2A0050C015 /* UIScrollView+RxTests.swift */,
C8379EF31D1DD326003EF8FC /* UIButton+RxTests.swift */,
); );
path = RxCocoaTests; path = RxCocoaTests;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2378,6 +2383,7 @@
C835090C1C38706D0027C24C /* Observable+BlockingTest.swift */, C835090C1C38706D0027C24C /* Observable+BlockingTest.swift */,
C835090D1C38706D0027C24C /* Observable+ConcurrencyTest.swift */, C835090D1C38706D0027C24C /* Observable+ConcurrencyTest.swift */,
C835090E1C38706D0027C24C /* Observable+CreationTest.swift */, C835090E1C38706D0027C24C /* Observable+CreationTest.swift */,
C8E9E42A1D43B26C0049644E /* Observable+DebugTest.swift */,
C83509131C38706D0027C24C /* Observable+MultipleTest.swift */, C83509131C38706D0027C24C /* Observable+MultipleTest.swift */,
C835090F1C38706D0027C24C /* Observable+MultipleTest+CombineLatest.swift */, C835090F1C38706D0027C24C /* Observable+MultipleTest+CombineLatest.swift */,
C83509101C38706D0027C24C /* Observable+MultipleTest+CombineLatest.tt */, C83509101C38706D0027C24C /* Observable+MultipleTest+CombineLatest.tt */,
@ -2394,6 +2400,7 @@
C835091A1C38706D0027C24C /* SubjectConcurrencyTest.swift */, C835091A1C38706D0027C24C /* SubjectConcurrencyTest.swift */,
C835091B1C38706D0027C24C /* VariableTest.swift */, C835091B1C38706D0027C24C /* VariableTest.swift */,
C835091C1C38706D0027C24C /* VirtualSchedulerTest.swift */, C835091C1C38706D0027C24C /* VirtualSchedulerTest.swift */,
C86B1E211D42BF5200130546 /* SchedulerTests.swift */,
); );
path = Tests; path = Tests;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2418,6 +2425,7 @@
C83D73B51C1DBAEE003DC470 /* InvocableType.swift */, C83D73B51C1DBAEE003DC470 /* InvocableType.swift */,
C83D73B61C1DBAEE003DC470 /* ScheduledItem.swift */, C83D73B61C1DBAEE003DC470 /* ScheduledItem.swift */,
C83D73B71C1DBAEE003DC470 /* ScheduledItemType.swift */, C83D73B71C1DBAEE003DC470 /* ScheduledItemType.swift */,
C80EEC331D42D06E00131C39 /* DispatchQueueConfiguration.swift */,
); );
path = Internal; path = Internal;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2521,6 +2529,7 @@
C8A56ACD1AD7424700B4673B = { C8A56ACD1AD7424700B4673B = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
C8D2C1501D4F3CD6006E2431 /* Rx.playground */,
C8093C471B8A72BE0088E94D /* RxSwift */, C8093C471B8A72BE0088E94D /* RxSwift */,
C8093F571B8A73A20088E94D /* RxBlocking */, C8093F571B8A73A20088E94D /* RxBlocking */,
C8093E801B8A732E0088E94D /* RxCocoa */, C8093E801B8A732E0088E94D /* RxCocoa */,
@ -2602,15 +2611,6 @@
path = Schedulers; path = Schedulers;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
CB832B351D19667900C27230 /* Proxies */ = {
isa = PBXGroup;
children = (
CB832B361D19669100C27230 /* RxTextFieldDelegateProxy.swift */,
CB832B3A1D1967A900C27230 /* RxTextViewDelegateProxy.swift */,
);
path = Proxies;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */ /* Begin PBXHeadersBuildPhase section */
@ -3140,23 +3140,48 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0720; LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 0720; LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Krunoslav Zaher"; ORGANIZATIONNAME = "Krunoslav Zaher";
TargetAttributes = { TargetAttributes = {
C80938F51B8A71760088E94D = {
LastSwiftMigration = 0800;
};
C809396F1B8A71840088E94D = {
LastSwiftMigration = 0800;
};
C8093B4B1B8A71F00088E94D = {
LastSwiftMigration = 0800;
};
C8093BC91B8A71FC0088E94D = {
LastSwiftMigration = 0800;
};
C83508C21C386F6F0027C24C = { C83508C21C386F6F0027C24C = {
CreatedOnToolsVersion = 7.2; CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
}; };
C83509831C38740E0027C24C = { C83509831C38740E0027C24C = {
CreatedOnToolsVersion = 7.2; CreatedOnToolsVersion = 7.2;
}; };
C83509931C38742C0027C24C = { C83509931C38742C0027C24C = {
CreatedOnToolsVersion = 7.2; CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
}; };
C85BA04A1C3878740075D68E = { C85BA04A1C3878740075D68E = {
CreatedOnToolsVersion = 7.2; CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
};
C88BB81A1B07E5ED0064D411 = {
LastSwiftMigration = 0800;
};
C88FA4FD1C25C44800CCFEA4 = {
LastSwiftMigration = 0800;
};
C88FA50E1C25C4B500CCFEA4 = {
LastSwiftMigration = 0800;
}; };
C8A56AD61AD7424700B4673B = { C8A56AD61AD7424700B4673B = {
CreatedOnToolsVersion = 6.3; CreatedOnToolsVersion = 6.3;
LastSwiftMigration = 0800;
}; };
D2138C741BB9BE9800339B5C = { D2138C741BB9BE9800339B5C = {
CreatedOnToolsVersion = 7.1; CreatedOnToolsVersion = 7.1;
@ -3239,7 +3264,6 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
C83509271C38706E0027C24C /* Info.plist in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -3390,7 +3414,7 @@
C882541F1B8A752B00B02D69 /* RxCollectionViewDelegateProxy.swift in Sources */, C882541F1B8A752B00B02D69 /* RxCollectionViewDelegateProxy.swift in Sources */,
46307D4E1CDE77D800E47A1C /* UIAlertAction+Rx.swift in Sources */, 46307D4E1CDE77D800E47A1C /* UIAlertAction+Rx.swift in Sources */,
C88254201B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift in Sources */, C88254201B8A752B00B02D69 /* RxScrollViewDelegateProxy.swift in Sources */,
C88F76811CE5341700D5A014 /* RxTextInput.swift in Sources */, C88F76811CE5341700D5A014 /* TextInput.swift in Sources */,
C882542E1B8A752B00B02D69 /* UILabel+Rx.swift in Sources */, C882542E1B8A752B00B02D69 /* UILabel+Rx.swift in Sources */,
54D2138E1CE0824E0028D5B4 /* UINavigationItem+Rx.swift in Sources */, 54D2138E1CE0824E0028D5B4 /* UINavigationItem+Rx.swift in Sources */,
91BE429C1CBF7EC000F6B062 /* UIPageControl+Rx.swift in Sources */, 91BE429C1CBF7EC000F6B062 /* UIPageControl+Rx.swift in Sources */,
@ -3458,7 +3482,7 @@
C8093EE41B8A732E0088E94D /* DelegateProxyType.swift in Sources */, C8093EE41B8A732E0088E94D /* DelegateProxyType.swift in Sources */,
C8093F481B8A732E0088E94D /* NSControl+Rx.swift in Sources */, C8093F481B8A732E0088E94D /* NSControl+Rx.swift in Sources */,
C8093F4E1B8A732E0088E94D /* NSTextField+Rx.swift in Sources */, C8093F4E1B8A732E0088E94D /* NSTextField+Rx.swift in Sources */,
C88F76821CE5341700D5A014 /* RxTextInput.swift in Sources */, C88F76821CE5341700D5A014 /* TextInput.swift in Sources */,
C8DB967F1BF7496C0084BD53 /* KVORepresentable.swift in Sources */, C8DB967F1BF7496C0084BD53 /* KVORepresentable.swift in Sources */,
C8093EFE1B8A732E0088E94D /* RxTarget.swift in Sources */, C8093EFE1B8A732E0088E94D /* RxTarget.swift in Sources */,
C8093ED21B8A732E0088E94D /* _RX.m in Sources */, C8093ED21B8A732E0088E94D /* _RX.m in Sources */,
@ -3470,8 +3494,6 @@
C80D339B1B922FB00014629D /* ControlProperty.swift in Sources */, C80D339B1B922FB00014629D /* ControlProperty.swift in Sources */,
C8BCD3F51C14B6D1005F1280 /* NSLayoutConstraint+Rx.swift in Sources */, C8BCD3F51C14B6D1005F1280 /* NSLayoutConstraint+Rx.swift in Sources */,
C8093EF01B8A732E0088E94D /* KVOObserver.swift in Sources */, C8093EF01B8A732E0088E94D /* KVOObserver.swift in Sources */,
CB832B331D19654700C27230 /* NSProgressIndicator+Rx.swift in Sources */,
CB832B391D19673900C27230 /* NSTextView+Rx.swift in Sources */,
C8093EEE1B8A732E0088E94D /* KVOObservable.swift in Sources */, C8093EEE1B8A732E0088E94D /* KVOObservable.swift in Sources */,
C8F6A1461BF0B9B2007DF367 /* NSObject+Rx+RawRepresentable.swift in Sources */, C8F6A1461BF0B9B2007DF367 /* NSObject+Rx+RawRepresentable.swift in Sources */,
C8093EE01B8A732E0088E94D /* CLLocationManager+Rx.swift in Sources */, C8093EE01B8A732E0088E94D /* CLLocationManager+Rx.swift in Sources */,
@ -3488,13 +3510,11 @@
C80DDE941BCE69BA006A1832 /* ControlEvent+Driver.swift in Sources */, C80DDE941BCE69BA006A1832 /* ControlEvent+Driver.swift in Sources */,
C80DDEB21BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */, C80DDEB21BCE8CA3006A1832 /* Driver+Operators+arity.swift in Sources */,
C811C89E1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */, C811C89E1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */,
CB832B3B1D1967A900C27230 /* RxTextViewDelegateProxy.swift in Sources */,
C8BCD3F21C14B62B005F1280 /* NSView+Rx.swift in Sources */, C8BCD3F21C14B62B005F1280 /* NSView+Rx.swift in Sources */,
C8093EE21B8A732E0088E94D /* DelegateProxy.swift in Sources */, C8093EE21B8A732E0088E94D /* DelegateProxy.swift in Sources */,
C8093EFA1B8A732E0088E94D /* RxCLLocationManagerDelegateProxy.swift in Sources */, C8093EFA1B8A732E0088E94D /* RxCLLocationManagerDelegateProxy.swift in Sources */,
C8093EE61B8A732E0088E94D /* Logging.swift in Sources */, C8093EE61B8A732E0088E94D /* Logging.swift in Sources */,
C8093EF21B8A732E0088E94D /* NSNotificationCenter+Rx.swift in Sources */, C8093EF21B8A732E0088E94D /* NSNotificationCenter+Rx.swift in Sources */,
CB832B371D19669100C27230 /* RxTextFieldDelegateProxy.swift in Sources */,
C8093EF81B8A732E0088E94D /* NSURLSession+Rx.swift in Sources */, C8093EF81B8A732E0088E94D /* NSURLSession+Rx.swift in Sources */,
C80DDE9C1BCE69BA006A1832 /* Driver+Operators.swift in Sources */, C80DDE9C1BCE69BA006A1832 /* Driver+Operators.swift in Sources */,
C8093F4C1B8A732E0088E94D /* NSSlider+Rx.swift in Sources */, C8093F4C1B8A732E0088E94D /* NSSlider+Rx.swift in Sources */,
@ -3542,6 +3562,7 @@
C83509531C38706E0027C24C /* Observable+AggregateTest.swift in Sources */, C83509531C38706E0027C24C /* Observable+AggregateTest.swift in Sources */,
C8B290891C94D64600E923D0 /* RxTest+Controls.swift in Sources */, C8B290891C94D64600E923D0 /* RxTest+Controls.swift in Sources */,
C83509291C38706E0027C24C /* PerformanceTools.swift in Sources */, C83509291C38706E0027C24C /* PerformanceTools.swift in Sources */,
C8E9E42B1D43B26C0049644E /* Observable+DebugTest.swift in Sources */,
C835096A1C38706E0027C24C /* TestErrors.swift in Sources */, C835096A1C38706E0027C24C /* TestErrors.swift in Sources */,
1AF67DA61CED430100C310FA /* ReplaySubjectTest.swift in Sources */, 1AF67DA61CED430100C310FA /* ReplaySubjectTest.swift in Sources */,
C83509561C38706E0027C24C /* Observable+ConcurrencyTest.swift in Sources */, C83509561C38706E0027C24C /* Observable+ConcurrencyTest.swift in Sources */,
@ -3552,6 +3573,7 @@
C83509351C38706E0027C24C /* KVOObservableTests.swift in Sources */, C83509351C38706E0027C24C /* KVOObservableTests.swift in Sources */,
C83509421C38706E0027C24C /* MainThreadPrimitiveHotObservable.swift in Sources */, C83509421C38706E0027C24C /* MainThreadPrimitiveHotObservable.swift in Sources */,
C835093A1C38706E0027C24C /* RuntimeStateSnapshot.swift in Sources */, C835093A1C38706E0027C24C /* RuntimeStateSnapshot.swift in Sources */,
C86B1E221D42BF5200130546 /* SchedulerTests.swift in Sources */,
C83509441C38706E0027C24C /* MySubject.swift in Sources */, C83509441C38706E0027C24C /* MySubject.swift in Sources */,
C835095F1C38706E0027C24C /* Observable+SubscriptionTest.swift in Sources */, C835095F1C38706E0027C24C /* Observable+SubscriptionTest.swift in Sources */,
C8C217D71CB710200038A2E6 /* UICollectionView+RxTests.swift in Sources */, C8C217D71CB710200038A2E6 /* UICollectionView+RxTests.swift in Sources */,
@ -3573,6 +3595,7 @@
C835093E1C38706E0027C24C /* UIView+RxTests.swift in Sources */, C835093E1C38706E0027C24C /* UIView+RxTests.swift in Sources */,
7EDBAEB41C89B1A6006CBE67 /* UITabBarItem+RxTests.swift in Sources */, 7EDBAEB41C89B1A6006CBE67 /* UITabBarItem+RxTests.swift in Sources */,
C83509411C38706E0027C24C /* BackgroundThreadPrimitiveHotObservable.swift in Sources */, C83509411C38706E0027C24C /* BackgroundThreadPrimitiveHotObservable.swift in Sources */,
C8379EF41D1DD326003EF8FC /* UIButton+RxTests.swift in Sources */,
C83509581C38706E0027C24C /* Observable+MultipleTest+CombineLatest.swift in Sources */, C83509581C38706E0027C24C /* Observable+MultipleTest+CombineLatest.swift in Sources */,
C83509651C38706E0027C24C /* VirtualSchedulerTest.swift in Sources */, C83509651C38706E0027C24C /* VirtualSchedulerTest.swift in Sources */,
8476A0211C3D5DC60040BA22 /* UIImagePickerController+RxTests.swift in Sources */, 8476A0211C3D5DC60040BA22 /* UIImagePickerController+RxTests.swift in Sources */,
@ -3644,6 +3667,7 @@
C83509EC1C3875580027C24C /* MockDisposable.swift in Sources */, C83509EC1C3875580027C24C /* MockDisposable.swift in Sources */,
1AF67DA31CED427D00C310FA /* PublishSubjectTest.swift in Sources */, 1AF67DA31CED427D00C310FA /* PublishSubjectTest.swift in Sources */,
C8350A111C38756A0027C24C /* Observable+SingleTest.swift in Sources */, C8350A111C38756A0027C24C /* Observable+SingleTest.swift in Sources */,
C8E9E42C1D43B26C0049644E /* Observable+DebugTest.swift in Sources */,
C8350A2A1C3875B50027C24C /* RxMutableBox.swift in Sources */, C8350A2A1C3875B50027C24C /* RxMutableBox.swift in Sources */,
C8350A151C38756A0027C24C /* ObserverTests.swift in Sources */, C8350A151C38756A0027C24C /* ObserverTests.swift in Sources */,
C83509B11C3874E20027C24C /* PerformanceTools.swift in Sources */, C83509B11C3874E20027C24C /* PerformanceTools.swift in Sources */,
@ -3681,6 +3705,7 @@
C83509EA1C3875580027C24C /* BackgroundThreadPrimitiveHotObservable.swift in Sources */, C83509EA1C3875580027C24C /* BackgroundThreadPrimitiveHotObservable.swift in Sources */,
C84CB1721C3876B800EB63CC /* UIView+RxTests.swift in Sources */, C84CB1721C3876B800EB63CC /* UIView+RxTests.swift in Sources */,
C83509F81C38755D0027C24C /* HistoricalSchedulerTest.swift in Sources */, C83509F81C38755D0027C24C /* HistoricalSchedulerTest.swift in Sources */,
C8379EF51D1DD326003EF8FC /* UIButton+RxTests.swift in Sources */,
C83509F21C38755D0027C24C /* AnonymousObservable+Test.swift in Sources */, C83509F21C38755D0027C24C /* AnonymousObservable+Test.swift in Sources */,
7FE849481C5D0D6B00845C0E /* UIRefreshControl+RxTests.swift in Sources */, 7FE849481C5D0D6B00845C0E /* UIRefreshControl+RxTests.swift in Sources */,
C83509D31C3875390027C24C /* RXObjCRuntime+Testing.m in Sources */, C83509D31C3875390027C24C /* RXObjCRuntime+Testing.m in Sources */,
@ -3690,6 +3715,7 @@
C83509AF1C3874DC0027C24C /* RxTest.swift in Sources */, C83509AF1C3874DC0027C24C /* RxTest.swift in Sources */,
C83509F41C38755D0027C24C /* BagTest.swift in Sources */, C83509F41C38755D0027C24C /* BagTest.swift in Sources */,
C8F27DC11CE68DA700D5FB4F /* UITextView+RxTests.swift in Sources */, C8F27DC11CE68DA700D5FB4F /* UITextView+RxTests.swift in Sources */,
C86B1E231D42BF5200130546 /* SchedulerTests.swift in Sources */,
C860EC961C42E26100A664B3 /* SectionedViewDataSourceMock.swift in Sources */, C860EC961C42E26100A664B3 /* SectionedViewDataSourceMock.swift in Sources */,
C8350A0F1C3875630027C24C /* Observable+MultipleTest+Zip.swift in Sources */, C8350A0F1C3875630027C24C /* Observable+MultipleTest+Zip.swift in Sources */,
); );
@ -3711,6 +3737,7 @@
C8350A071C38755E0027C24C /* MainSchedulerTests.swift in Sources */, C8350A071C38755E0027C24C /* MainSchedulerTests.swift in Sources */,
C83509B81C38750D0027C24C /* ControlEventTests.swift in Sources */, C83509B81C38750D0027C24C /* ControlEventTests.swift in Sources */,
C83509CB1C3875230027C24C /* KVOObservableTests.swift in Sources */, C83509CB1C3875230027C24C /* KVOObservableTests.swift in Sources */,
C8E9E42D1D43B26C0049644E /* Observable+DebugTest.swift in Sources */,
C83509AD1C3874D70027C24C /* Foundation+Extensions.swift in Sources */, C83509AD1C3874D70027C24C /* Foundation+Extensions.swift in Sources */,
C83509C81C3875230027C24C /* DelegateProxyTest.swift in Sources */, C83509C81C3875230027C24C /* DelegateProxyTest.swift in Sources */,
C8350A0D1C38755E0027C24C /* Observable+MultipleTest+CombineLatest.swift in Sources */, C8350A0D1C38755E0027C24C /* Observable+MultipleTest+CombineLatest.swift in Sources */,
@ -3722,6 +3749,7 @@
C83509A71C3874D10027C24C /* TestErrors.swift in Sources */, C83509A71C3874D10027C24C /* TestErrors.swift in Sources */,
C83509D61C3875420027C24C /* SentMessageTest.swift in Sources */, C83509D61C3875420027C24C /* SentMessageTest.swift in Sources */,
C8350A021C38755E0027C24C /* BagTest.swift in Sources */, C8350A021C38755E0027C24C /* BagTest.swift in Sources */,
C86B1E241D42BF5200130546 /* SchedulerTests.swift in Sources */,
C8350A081C38755E0027C24C /* Observable+AggregateTest.swift in Sources */, C8350A081C38755E0027C24C /* Observable+AggregateTest.swift in Sources */,
C83509E81C3875580027C24C /* PrimitiveMockObserver.swift in Sources */, C83509E81C3875580027C24C /* PrimitiveMockObserver.swift in Sources */,
C83509BE1C3875100027C24C /* DelegateProxyTest+Cocoa.swift in Sources */, C83509BE1C3875100027C24C /* DelegateProxyTest+Cocoa.swift in Sources */,
@ -3791,6 +3819,7 @@
C849BE2C1BAB5D070019AD27 /* ObservableConvertibleType.swift in Sources */, C849BE2C1BAB5D070019AD27 /* ObservableConvertibleType.swift in Sources */,
C8C3DA0A1B93941E004D233E /* Error.swift in Sources */, C8C3DA0A1B93941E004D233E /* Error.swift in Sources */,
C8093D9C1B8A72BE0088E94D /* SchedulerServices+Emulation.swift in Sources */, C8093D9C1B8A72BE0088E94D /* SchedulerServices+Emulation.swift in Sources */,
C80EEC351D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */,
C80DA3391C30B20B00C588B9 /* VirtualTimeScheduler.swift in Sources */, C80DA3391C30B20B00C588B9 /* VirtualTimeScheduler.swift in Sources */,
C8093D6A1B8A72BE0088E94D /* AnyObserver.swift in Sources */, C8093D6A1B8A72BE0088E94D /* AnyObserver.swift in Sources */,
C8093D3C1B8A72BE0088E94D /* Skip.swift in Sources */, C8093D3C1B8A72BE0088E94D /* Skip.swift in Sources */,
@ -3813,7 +3842,7 @@
C8093DA41B8A72BE0088E94D /* ReplaySubject.swift in Sources */, C8093DA41B8A72BE0088E94D /* ReplaySubject.swift in Sources */,
C8C3D9FF1B935EDF004D233E /* Zip+CollectionType.swift in Sources */, C8C3D9FF1B935EDF004D233E /* Zip+CollectionType.swift in Sources */,
C8093D641B8A72BE0088E94D /* Observable+Time.swift in Sources */, C8093D641B8A72BE0088E94D /* Observable+Time.swift in Sources */,
C8093CFC1B8A72BE0088E94D /* Observable+Extensions.swift in Sources */, C8093CFC1B8A72BE0088E94D /* ObservableType+Extensions.swift in Sources */,
C8093D4A1B8A72BE0088E94D /* Throttle.swift in Sources */, C8093D4A1B8A72BE0088E94D /* Throttle.swift in Sources */,
C8B145011BD2D80100267DCE /* ImmediateScheduler.swift in Sources */, C8B145011BD2D80100267DCE /* ImmediateScheduler.swift in Sources */,
C8093D061B8A72BE0088E94D /* Catch.swift in Sources */, C8093D061B8A72BE0088E94D /* Catch.swift in Sources */,
@ -3889,6 +3918,7 @@
C8093D9E1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */, C8093D9E1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */,
C8093D341B8A72BE0088E94D /* RefCount.swift in Sources */, C8093D341B8A72BE0088E94D /* RefCount.swift in Sources */,
C8093D0E1B8A72BE0088E94D /* Concat.swift in Sources */, C8093D0E1B8A72BE0088E94D /* Concat.swift in Sources */,
CDDEF16B1D4FB40000CA8546 /* Disposables.swift in Sources */,
C8093CCA1B8A72BE0088E94D /* Lock.swift in Sources */, C8093CCA1B8A72BE0088E94D /* Lock.swift in Sources */,
C8093D441B8A72BE0088E94D /* Take.swift in Sources */, C8093D441B8A72BE0088E94D /* Take.swift in Sources */,
C84CC5591BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, C84CC5591BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */,
@ -3913,7 +3943,6 @@
CBEE77201BD649A000AD584C /* ToArray.swift in Sources */, CBEE77201BD649A000AD584C /* ToArray.swift in Sources */,
C8093CFE1B8A72BE0088E94D /* Observable.swift in Sources */, C8093CFE1B8A72BE0088E94D /* Observable.swift in Sources */,
C84CC55E1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, C84CC55E1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */,
C8093CE21B8A72BE0088E94D /* NAryDisposable.swift in Sources */,
C8093CEC1B8A72BE0088E94D /* SerialDisposable.swift in Sources */, C8093CEC1B8A72BE0088E94D /* SerialDisposable.swift in Sources */,
C8C3DA0D1B93959F004D233E /* Never.swift in Sources */, C8C3DA0D1B93959F004D233E /* Never.swift in Sources */,
C84CC5681BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, C84CC5681BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */,
@ -4013,6 +4042,7 @@
C849BE2B1BAB5D070019AD27 /* ObservableConvertibleType.swift in Sources */, C849BE2B1BAB5D070019AD27 /* ObservableConvertibleType.swift in Sources */,
C8C3DA091B93941E004D233E /* Error.swift in Sources */, C8C3DA091B93941E004D233E /* Error.swift in Sources */,
C8093D9B1B8A72BE0088E94D /* SchedulerServices+Emulation.swift in Sources */, C8093D9B1B8A72BE0088E94D /* SchedulerServices+Emulation.swift in Sources */,
C80EEC341D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */,
C8093D691B8A72BE0088E94D /* AnyObserver.swift in Sources */, C8093D691B8A72BE0088E94D /* AnyObserver.swift in Sources */,
C8093D3B1B8A72BE0088E94D /* Skip.swift in Sources */, C8093D3B1B8A72BE0088E94D /* Skip.swift in Sources */,
C8B144FB1BD2D44500267DCE /* ConcurrentMainScheduler.swift in Sources */, C8B144FB1BD2D44500267DCE /* ConcurrentMainScheduler.swift in Sources */,
@ -4034,7 +4064,7 @@
C8093DA31B8A72BE0088E94D /* ReplaySubject.swift in Sources */, C8093DA31B8A72BE0088E94D /* ReplaySubject.swift in Sources */,
C8C3D9FE1B935EDF004D233E /* Zip+CollectionType.swift in Sources */, C8C3D9FE1B935EDF004D233E /* Zip+CollectionType.swift in Sources */,
C8093D631B8A72BE0088E94D /* Observable+Time.swift in Sources */, C8093D631B8A72BE0088E94D /* Observable+Time.swift in Sources */,
C8093CFB1B8A72BE0088E94D /* Observable+Extensions.swift in Sources */, C8093CFB1B8A72BE0088E94D /* ObservableType+Extensions.swift in Sources */,
C8093D491B8A72BE0088E94D /* Throttle.swift in Sources */, C8093D491B8A72BE0088E94D /* Throttle.swift in Sources */,
C8B145001BD2D80100267DCE /* ImmediateScheduler.swift in Sources */, C8B145001BD2D80100267DCE /* ImmediateScheduler.swift in Sources */,
C8093D051B8A72BE0088E94D /* Catch.swift in Sources */, C8093D051B8A72BE0088E94D /* Catch.swift in Sources */,
@ -4111,6 +4141,7 @@
C8093D9D1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */, C8093D9D1B8A72BE0088E94D /* SerialDispatchQueueScheduler.swift in Sources */,
C8093D331B8A72BE0088E94D /* RefCount.swift in Sources */, C8093D331B8A72BE0088E94D /* RefCount.swift in Sources */,
C8093D0D1B8A72BE0088E94D /* Concat.swift in Sources */, C8093D0D1B8A72BE0088E94D /* Concat.swift in Sources */,
CDDEF16A1D4FB40000CA8546 /* Disposables.swift in Sources */,
C8093CC91B8A72BE0088E94D /* Lock.swift in Sources */, C8093CC91B8A72BE0088E94D /* Lock.swift in Sources */,
C8093D431B8A72BE0088E94D /* Take.swift in Sources */, C8093D431B8A72BE0088E94D /* Take.swift in Sources */,
C84CC5581BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, C84CC5581BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */,
@ -4135,7 +4166,6 @@
CBEE771F1BD649A000AD584C /* ToArray.swift in Sources */, CBEE771F1BD649A000AD584C /* ToArray.swift in Sources */,
C8093CFD1B8A72BE0088E94D /* Observable.swift in Sources */, C8093CFD1B8A72BE0088E94D /* Observable.swift in Sources */,
C84CC55D1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, C84CC55D1BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */,
C8093CE11B8A72BE0088E94D /* NAryDisposable.swift in Sources */,
C8093CEB1B8A72BE0088E94D /* SerialDisposable.swift in Sources */, C8093CEB1B8A72BE0088E94D /* SerialDisposable.swift in Sources */,
C8C3DA0C1B93959F004D233E /* Never.swift in Sources */, C8C3DA0C1B93959F004D233E /* Never.swift in Sources */,
C84CC5671BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, C84CC5671BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */,
@ -4159,6 +4189,7 @@
C89461751BC6C1210055219D /* ObservableConvertibleType.swift in Sources */, C89461751BC6C1210055219D /* ObservableConvertibleType.swift in Sources */,
C8F0BF981BBBFB8B001B112F /* Error.swift in Sources */, C8F0BF981BBBFB8B001B112F /* Error.swift in Sources */,
C8F0BF991BBBFB8B001B112F /* SchedulerServices+Emulation.swift in Sources */, C8F0BF991BBBFB8B001B112F /* SchedulerServices+Emulation.swift in Sources */,
C80EEC371D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */,
C80DA33B1C30B20C00C588B9 /* VirtualTimeScheduler.swift in Sources */, C80DA33B1C30B20C00C588B9 /* VirtualTimeScheduler.swift in Sources */,
C8F0BF9A1BBBFB8B001B112F /* AnyObserver.swift in Sources */, C8F0BF9A1BBBFB8B001B112F /* AnyObserver.swift in Sources */,
C8F0BF9B1BBBFB8B001B112F /* Skip.swift in Sources */, C8F0BF9B1BBBFB8B001B112F /* Skip.swift in Sources */,
@ -4181,7 +4212,7 @@
C8F0BFA61BBBFB8B001B112F /* ReplaySubject.swift in Sources */, C8F0BFA61BBBFB8B001B112F /* ReplaySubject.swift in Sources */,
C8F0BFA71BBBFB8B001B112F /* Zip+CollectionType.swift in Sources */, C8F0BFA71BBBFB8B001B112F /* Zip+CollectionType.swift in Sources */,
C8F0BFA81BBBFB8B001B112F /* Observable+Time.swift in Sources */, C8F0BFA81BBBFB8B001B112F /* Observable+Time.swift in Sources */,
C8F0BFA91BBBFB8B001B112F /* Observable+Extensions.swift in Sources */, C8F0BFA91BBBFB8B001B112F /* ObservableType+Extensions.swift in Sources */,
C8F0BFAA1BBBFB8B001B112F /* Throttle.swift in Sources */, C8F0BFAA1BBBFB8B001B112F /* Throttle.swift in Sources */,
C8B145031BD2D80100267DCE /* ImmediateScheduler.swift in Sources */, C8B145031BD2D80100267DCE /* ImmediateScheduler.swift in Sources */,
C8F0BFAC1BBBFB8B001B112F /* Catch.swift in Sources */, C8F0BFAC1BBBFB8B001B112F /* Catch.swift in Sources */,
@ -4257,6 +4288,7 @@
C8F0BFE01BBBFB8B001B112F /* SerialDispatchQueueScheduler.swift in Sources */, C8F0BFE01BBBFB8B001B112F /* SerialDispatchQueueScheduler.swift in Sources */,
C8F0BFE11BBBFB8B001B112F /* RefCount.swift in Sources */, C8F0BFE11BBBFB8B001B112F /* RefCount.swift in Sources */,
C8F0BFE21BBBFB8B001B112F /* Concat.swift in Sources */, C8F0BFE21BBBFB8B001B112F /* Concat.swift in Sources */,
CDDEF16D1D4FB40000CA8546 /* Disposables.swift in Sources */,
C8F0BFE31BBBFB8B001B112F /* Lock.swift in Sources */, C8F0BFE31BBBFB8B001B112F /* Lock.swift in Sources */,
C8F0BFE41BBBFB8B001B112F /* Take.swift in Sources */, C8F0BFE41BBBFB8B001B112F /* Take.swift in Sources */,
C84CC55B1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, C84CC55B1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */,
@ -4281,7 +4313,6 @@
CBEE77221BD649A000AD584C /* ToArray.swift in Sources */, CBEE77221BD649A000AD584C /* ToArray.swift in Sources */,
C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */, C8F0BFF41BBBFB8B001B112F /* Observable.swift in Sources */,
C84CC5601BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */, C84CC5601BDD010800E06A64 /* SynchronizedUnsubscribeType.swift in Sources */,
C8F0BFF51BBBFB8B001B112F /* NAryDisposable.swift in Sources */,
C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */, C8F0BFF61BBBFB8B001B112F /* SerialDisposable.swift in Sources */,
C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */, C8F0BFF71BBBFB8B001B112F /* Never.swift in Sources */,
C84CC56A1BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */, C84CC56A1BDD08A500E06A64 /* SubscriptionDisposable.swift in Sources */,
@ -4346,6 +4377,7 @@
C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */, C8F0C0261BBBFBB9001B112F /* _RXDelegateProxy.m in Sources */,
C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */, C8F0C0271BBBFBB9001B112F /* NSObject+Rx.swift in Sources */,
9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */, 9BA1CBFE1C0F84C40044B50A /* UIActivityIndicatorView+Rx.swift in Sources */,
87379AE01D61C6F50047CA88 /* Reactive.swift in Sources */,
842A5A2E1C357F94003568D5 /* NSTextStorage+Rx.swift in Sources */, 842A5A2E1C357F94003568D5 /* NSTextStorage+Rx.swift in Sources */,
C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */, C8F0C0281BBBFBB9001B112F /* RxTextViewDelegateProxy.swift in Sources */,
C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */, C8F0C0291BBBFBB9001B112F /* UIBarButtonItem+Rx.swift in Sources */,
@ -4370,7 +4402,7 @@
C8F0C0381BBBFBB9001B112F /* UITextField+Rx.swift in Sources */, C8F0C0381BBBFBB9001B112F /* UITextField+Rx.swift in Sources */,
C8F0C0391BBBFBB9001B112F /* NSURLSession+Rx.swift in Sources */, C8F0C0391BBBFBB9001B112F /* NSURLSession+Rx.swift in Sources */,
C8F0C03A1BBBFBB9001B112F /* ControlTarget.swift in Sources */, C8F0C03A1BBBFBB9001B112F /* ControlTarget.swift in Sources */,
C88F76841CE5341700D5A014 /* RxTextInput.swift in Sources */, C88F76841CE5341700D5A014 /* TextInput.swift in Sources */,
C8F0C03B1BBBFBB9001B112F /* UISearchBar+Rx.swift in Sources */, C8F0C03B1BBBFBB9001B112F /* UISearchBar+Rx.swift in Sources */,
C8F0C03C1BBBFBB9001B112F /* ItemEvents.swift in Sources */, C8F0C03C1BBBFBB9001B112F /* ItemEvents.swift in Sources */,
7EDBAEBF1C89B9B7006CBE67 /* UITabBarItem+Rx.swift in Sources */, 7EDBAEBF1C89B9B7006CBE67 /* UITabBarItem+Rx.swift in Sources */,
@ -4435,7 +4467,7 @@
C80DDEA91BCE69BA006A1832 /* ObservableConvertibleType+Driver.swift in Sources */, C80DDEA91BCE69BA006A1832 /* ObservableConvertibleType+Driver.swift in Sources */,
C80DDEA11BCE69BA006A1832 /* Driver+Subscription.swift in Sources */, C80DDEA11BCE69BA006A1832 /* Driver+Subscription.swift in Sources */,
D2138C891BB9BEBE00339B5C /* DelegateProxyType.swift in Sources */, D2138C891BB9BEBE00339B5C /* DelegateProxyType.swift in Sources */,
C88F76831CE5341700D5A014 /* RxTextInput.swift in Sources */, C88F76831CE5341700D5A014 /* TextInput.swift in Sources */,
C811C89F1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */, C811C89F1C24D80100A2DDD4 /* DeallocObservable.swift in Sources */,
54D213921CE08D0C0028D5B4 /* UINavigationItem+Rx.swift in Sources */, 54D213921CE08D0C0028D5B4 /* UINavigationItem+Rx.swift in Sources */,
D2F461041CD7AC2100527B4D /* Reactive.swift in Sources */, D2F461041CD7AC2100527B4D /* Reactive.swift in Sources */,
@ -4499,6 +4531,7 @@
C89461761BC6C1220055219D /* ObservableConvertibleType.swift in Sources */, C89461761BC6C1220055219D /* ObservableConvertibleType.swift in Sources */,
D2EBEAF71BB9B6B2003A27DC /* ScheduledDisposable.swift in Sources */, D2EBEAF71BB9B6B2003A27DC /* ScheduledDisposable.swift in Sources */,
D2EBEAE11BB9B697003A27DC /* ImmediateSchedulerType.swift in Sources */, D2EBEAE11BB9B697003A27DC /* ImmediateSchedulerType.swift in Sources */,
C80EEC361D42D06E00131C39 /* DispatchQueueConfiguration.swift in Sources */,
C80DA33A1C30B20B00C588B9 /* VirtualTimeScheduler.swift in Sources */, C80DA33A1C30B20B00C588B9 /* VirtualTimeScheduler.swift in Sources */,
D2EBEB0B1BB9B6C1003A27DC /* Empty.swift in Sources */, D2EBEB0B1BB9B6C1003A27DC /* Empty.swift in Sources */,
D2EBEAF11BB9B6AE003A27DC /* BinaryDisposable.swift in Sources */, D2EBEAF11BB9B6AE003A27DC /* BinaryDisposable.swift in Sources */,
@ -4574,7 +4607,6 @@
D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */, D2EBEAF61BB9B6B2003A27DC /* NopDisposable.swift in Sources */,
CB30D9EB1BF0E3500084C1C0 /* SingleAsync.swift in Sources */, CB30D9EB1BF0E3500084C1C0 /* SingleAsync.swift in Sources */,
D2EBEAFF1BB9B6BA003A27DC /* Buffer.swift in Sources */, D2EBEAFF1BB9B6BA003A27DC /* Buffer.swift in Sources */,
D2EBEAF51BB9B6AE003A27DC /* NAryDisposable.swift in Sources */,
D2EBEB1D1BB9B6C1003A27DC /* Scan.swift in Sources */, D2EBEB1D1BB9B6C1003A27DC /* Scan.swift in Sources */,
D2EBEB261BB9B6C1003A27DC /* Throttle.swift in Sources */, D2EBEB261BB9B6C1003A27DC /* Throttle.swift in Sources */,
D2EBEAE81BB9B697003A27DC /* Rx.swift in Sources */, D2EBEAE81BB9B697003A27DC /* Rx.swift in Sources */,
@ -4590,7 +4622,7 @@
D2EBEAE91BB9B697003A27DC /* RxMutableBox.swift in Sources */, D2EBEAE91BB9B697003A27DC /* RxMutableBox.swift in Sources */,
D2EBEAFC1BB9B6BA003A27DC /* Amb.swift in Sources */, D2EBEAFC1BB9B6BA003A27DC /* Amb.swift in Sources */,
D2EBEB231BB9B6C1003A27DC /* Take.swift in Sources */, D2EBEB231BB9B6C1003A27DC /* Take.swift in Sources */,
D2EBEAE31BB9B697003A27DC /* Observable+Extensions.swift in Sources */, D2EBEAE31BB9B697003A27DC /* ObservableType+Extensions.swift in Sources */,
B1D899911BF653410027B05C /* Timeout.swift in Sources */, B1D899911BF653410027B05C /* Timeout.swift in Sources */,
D2EBEB121BB9B6C1003A27DC /* Merge.swift in Sources */, D2EBEB121BB9B6C1003A27DC /* Merge.swift in Sources */,
D2EBEAEF1BB9B6A4003A27DC /* Queue.swift in Sources */, D2EBEAEF1BB9B6A4003A27DC /* Queue.swift in Sources */,
@ -4598,6 +4630,7 @@
D2EBEB2B1BB9B6CA003A27DC /* Observable+Aggregate.swift in Sources */, D2EBEB2B1BB9B6CA003A27DC /* Observable+Aggregate.swift in Sources */,
D2EBEB291BB9B6C1003A27DC /* Zip+arity.swift in Sources */, D2EBEB291BB9B6C1003A27DC /* Zip+arity.swift in Sources */,
D2EBEB241BB9B6C1003A27DC /* TakeUntil.swift in Sources */, D2EBEB241BB9B6C1003A27DC /* TakeUntil.swift in Sources */,
CDDEF16C1D4FB40000CA8546 /* Disposables.swift in Sources */,
C84CC55A1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */, C84CC55A1BDCF51200E06A64 /* SynchronizedSubscribeType.swift in Sources */,
D2EBEB3B1BB9B6D8003A27DC /* OperationQueueScheduler.swift in Sources */, D2EBEB3B1BB9B6D8003A27DC /* OperationQueueScheduler.swift in Sources */,
D2EBEAE51BB9B697003A27DC /* AnyObserver.swift in Sources */, D2EBEAE51BB9B697003A27DC /* AnyObserver.swift in Sources */,
@ -5212,8 +5245,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -5223,6 +5258,7 @@
ENABLE_BITCODE = YES; ENABLE_BITCODE = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "TRACE_RESOURCES=1"; GCC_PREPROCESSOR_DEFINITIONS = "TRACE_RESOURCES=1";
@ -5234,11 +5270,12 @@
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MACOSX_DEPLOYMENT_TARGET = 10.9; MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
OTHER_SWIFT_FLAGS = "-D TRACE_RESOURCES"; OTHER_SWIFT_FLAGS = "-D TRACE_RESOURCES";
SDKROOT = ""; SDKROOT = "";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = 9.0; TVOS_DEPLOYMENT_TARGET = 9.0;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
@ -5471,6 +5508,7 @@
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
INFOPLIST_FILE = RxTests/Info.plist; INFOPLIST_FILE = RxTests/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -5492,6 +5530,7 @@
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
INFOPLIST_FILE = RxTests/Info.plist; INFOPLIST_FILE = RxTests/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -5513,6 +5552,7 @@
DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1; DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath"; DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks"; FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
INFOPLIST_FILE = RxTests/Info.plist; INFOPLIST_FILE = RxTests/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@ -5603,8 +5643,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -5631,12 +5673,13 @@
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MACOSX_DEPLOYMENT_TARGET = 10.9; MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "-D TRACE_RESOURCES -D DEBUG"; OTHER_SWIFT_FLAGS = "-D TRACE_RESOURCES -D DEBUG";
SDKROOT = ""; SDKROOT = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = 9.0; TVOS_DEPLOYMENT_TARGET = 9.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -5659,8 +5702,10 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@ -5670,6 +5715,7 @@
ENABLE_BITCODE = YES; ENABLE_BITCODE = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES;
@ -5680,11 +5726,12 @@
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MACOSX_DEPLOYMENT_TARGET = 10.9; MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
OTHER_SWIFT_FLAGS = "-D RELEASE"; OTHER_SWIFT_FLAGS = "-D RELEASE";
SDKROOT = ""; SDKROOT = "";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = 9.0; TVOS_DEPLOYMENT_TARGET = 9.0;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0720" LastUpgradeVersion = "0800"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Workspace <Workspace
version = "1.0"> version = "1.0">
<FileRef
location = "group:Rx.playground">
</FileRef>
<FileRef <FileRef
location = "group:Package.swift"> location = "group:Package.swift">
</FileRef> </FileRef>
@ -10,6 +13,9 @@
<FileRef <FileRef
location = "group:README.md"> location = "group:README.md">
</FileRef> </FileRef>
<FileRef
location = "group:ISSUE_TEMPLATE.md">
</FileRef>
<FileRef <FileRef
location = "group:CHANGELOG.md"> location = "group:CHANGELOG.md">
</FileRef> </FileRef>
@ -32,33 +38,8 @@
<Group <Group
location = "group:scripts" location = "group:scripts"
name = "scripts"> name = "scripts">
<Group
location = "group:automation-tests"
name = "automation-tests">
<FileRef
location = "group:01_githubSignUp.js">
</FileRef>
<FileRef
location = "group:02_searchWikipedia.js">
</FileRef>
<FileRef
location = "group:03_masterDetail.js">
</FileRef>
<FileRef
location = "group:04_controlsTests.js">
</FileRef>
<FileRef
location = "group:05_reactivePartialUpdates.js">
</FileRef>
<FileRef
location = "group:common.js">
</FileRef>
<FileRef
location = "group:main.js">
</FileRef>
</Group>
<FileRef <FileRef
location = "group:automation-tests.sh"> location = "group:all-tests.sh">
</FileRef> </FileRef>
<FileRef <FileRef
location = "group:common.sh"> location = "group:common.sh">
@ -66,9 +47,6 @@
<FileRef <FileRef
location = "group:/Users/kzaher/Projects/RxSwift/scripts/package-spm.swift"> location = "group:/Users/kzaher/Projects/RxSwift/scripts/package-spm.swift">
</FileRef> </FileRef>
<FileRef
location = "group:pre-release-tests.sh">
</FileRef>
<FileRef <FileRef
location = "group:test-linux.sh"> location = "group:test-linux.sh">
</FileRef> </FileRef>
@ -103,9 +81,6 @@
<FileRef <FileRef
location = "group:HotAndColdObservables.md"> location = "group:HotAndColdObservables.md">
</FileRef> </FileRef>
<FileRef
location = "group:IssueTemplate.md">
</FileRef>
<FileRef <FileRef
location = "group:Linux.md"> location = "group:Linux.md">
</FileRef> </FileRef>
@ -128,9 +103,6 @@
location = "group:Warnings.md"> location = "group:Warnings.md">
</FileRef> </FileRef>
</Group> </Group>
<FileRef
location = "group:Rx.playground">
</FileRef>
<FileRef <FileRef
location = "group:Rx.xcodeproj"> location = "group:Rx.xcodeproj">
</FileRef> </FileRef>

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "RxBlocking" s.name = "RxBlocking"
s.version = "2.5.0" s.version = "3.0.0.alpha.1"
s.summary = "RxSwift Blocking operatos" s.summary = "RxSwift Blocking operatos"
s.description = <<-DESC s.description = <<-DESC
Set of blocking operators for RxSwift. These operators are mostly intended for unit/integration tests Set of blocking operators for RxSwift. These operators are mostly intended for unit/integration tests
@ -18,11 +18,11 @@ Waiting for observable sequence to complete before exiting command line applicat
s.requires_arc = true s.requires_arc = true
s.ios.deployment_target = '8.0' s.ios.deployment_target = '8.0'
s.osx.deployment_target = '10.9' s.osx.deployment_target = '10.10'
s.watchos.deployment_target = '2.0' s.watchos.deployment_target = '2.0'
s.tvos.deployment_target = '9.0' s.tvos.deployment_target = '9.0'
s.source_files = 'RxBlocking/**/*.swift' s.source_files = 'RxBlocking/**/*.swift'
s.dependency 'RxSwift', '~> 2.5' s.dependency 'RxSwift', '~> 3.0.0.alpha.1'
end end

View File

@ -22,7 +22,7 @@ extension BlockingObservable {
public func toArray() throws -> [E] { public func toArray() throws -> [E] {
var elements: [E] = Array<E>() var elements: [E] = Array<E>()
var error: ErrorType? var error: Swift.Error?
let lock = RunLoopLock() let lock = RunLoopLock()
@ -30,17 +30,17 @@ extension BlockingObservable {
lock.dispatch { lock.dispatch {
d.disposable = self.source.subscribe { e in d.disposable = self.source.subscribe { e in
if d.disposed { if d.isDisposed {
return return
} }
switch e { switch e {
case .Next(let element): case .next(let element):
elements.append(element) elements.append(element)
case .Error(let e): case .error(let e):
error = e error = e
d.dispose() d.dispose()
lock.stop() lock.stop()
case .Completed: case .completed:
d.dispose() d.dispose()
lock.stop() lock.stop()
} }
@ -70,7 +70,7 @@ extension BlockingObservable {
public func first() throws -> E? { public func first() throws -> E? {
var element: E? var element: E?
var error: ErrorType? var error: Swift.Error?
let d = SingleAssignmentDisposable() let d = SingleAssignmentDisposable()
@ -78,17 +78,17 @@ extension BlockingObservable {
lock.dispatch { lock.dispatch {
d.disposable = self.source.subscribe { e in d.disposable = self.source.subscribe { e in
if d.disposed { if d.isDisposed {
return return
} }
switch e { switch e {
case .Next(let e): case .next(let e):
if element == nil { if element == nil {
element = e element = e
} }
break break
case .Error(let e): case .error(let e):
error = e error = e
default: default:
break break
@ -122,7 +122,7 @@ extension BlockingObservable {
public func last() throws -> E? { public func last() throws -> E? {
var element: E? var element: E?
var error: ErrorType? var error: Swift.Error?
let d = SingleAssignmentDisposable() let d = SingleAssignmentDisposable()
@ -130,14 +130,14 @@ extension BlockingObservable {
lock.dispatch { lock.dispatch {
d.disposable = self.source.subscribe { e in d.disposable = self.source.subscribe { e in
if d.disposed { if d.isDisposed {
return return
} }
switch e { switch e {
case .Next(let e): case .next(let e):
element = e element = e
return return
case .Error(let e): case .error(let e):
error = e error = e
default: default:
break break
@ -180,10 +180,10 @@ extension BlockingObservable {
- parameter predicate: A function to test each source element for a condition. - parameter predicate: A function to test each source element for a condition.
- returns: Returns the only element of an sequence that satisfies the condition in the predicate, and reports an error if there is not exactly one element in the sequence. - returns: Returns the only element of an sequence that satisfies the condition in the predicate, and reports an error if there is not exactly one element in the sequence.
*/ */
public func single(predicate: (E) throws -> Bool) throws -> E? { public func single(_ predicate: @escaping (E) throws -> Bool) throws -> E? {
var element: E? var element: E?
var error: ErrorType? var error: Swift.Error?
let d = SingleAssignmentDisposable() let d = SingleAssignmentDisposable()
@ -191,11 +191,11 @@ extension BlockingObservable {
lock.dispatch { lock.dispatch {
d.disposable = self.source.subscribe { e in d.disposable = self.source.subscribe { e in
if d.disposed { if d.isDisposed {
return return
} }
switch e { switch e {
case .Next(let e): case .next(let e):
do { do {
if try !predicate(e) { if try !predicate(e) {
return return
@ -203,7 +203,7 @@ extension BlockingObservable {
if element == nil { if element == nil {
element = e element = e
} else { } else {
throw RxError.MoreThanOneElement throw RxError.moreThanOneElement
} }
} catch (let err) { } catch (let err) {
error = err error = err
@ -211,11 +211,11 @@ extension BlockingObservable {
lock.stop() lock.stop()
} }
return return
case .Error(let e): case .error(let e):
error = e error = e
case .Completed: case .completed:
if element == nil { if element == nil {
error = RxError.NoElements error = RxError.noElements
} }
} }

Binary file not shown.

View File

@ -17,8 +17,8 @@ extension ObservableConvertibleType {
- returns: `BlockingObservable` version of `self` - returns: `BlockingObservable` version of `self`
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func toBlocking() -> BlockingObservable<E> { public func toBlocking() -> BlockingObservable<E> {
return BlockingObservable(source: self.asObservable()) return BlockingObservable(source: self.asObservable())
} }
} }

View File

@ -29,7 +29,7 @@ typealias AtomicInt = Int32
#endif #endif
class RunLoopLock { class RunLoopLock {
let currentRunLoop: CFRunLoopRef let currentRunLoop: CFRunLoop
var calledRun: AtomicInt = 0 var calledRun: AtomicInt = 0
var calledStop: AtomicInt = 0 var calledStop: AtomicInt = 0
@ -38,12 +38,12 @@ class RunLoopLock {
currentRunLoop = CFRunLoopGetCurrent() currentRunLoop = CFRunLoopGetCurrent()
} }
func dispatch(action: () -> ()) { func dispatch(_ action: @escaping () -> ()) {
CFRunLoopPerformBlock(currentRunLoop, kCFRunLoopDefaultMode) { CFRunLoopPerformBlock(currentRunLoop, CFRunLoopMode.defaultMode.rawValue) {
if CurrentThreadScheduler.isScheduleRequired { if CurrentThreadScheduler.isScheduleRequired {
CurrentThreadScheduler.instance.schedule(()) { _ in _ = CurrentThreadScheduler.instance.schedule(()) { _ in
action() action()
return NopDisposable.instance return Disposables.create()
} }
} }
else { else {
@ -57,7 +57,7 @@ class RunLoopLock {
if AtomicIncrement(&calledStop) != 1 { if AtomicIncrement(&calledStop) != 1 {
return return
} }
CFRunLoopPerformBlock(currentRunLoop, kCFRunLoopDefaultMode) { CFRunLoopPerformBlock(currentRunLoop, CFRunLoopMode.defaultMode.rawValue) {
CFRunLoopStop(self.currentRunLoop) CFRunLoopStop(self.currentRunLoop)
} }
CFRunLoopWakeUp(currentRunLoop) CFRunLoopWakeUp(currentRunLoop)

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "RxCocoa" s.name = "RxCocoa"
s.version = "2.5.0" s.version = "3.0.0.alpha.1"
s.summary = "RxSwift Cocoa extensions" s.summary = "RxSwift Cocoa extensions"
s.description = <<-DESC s.description = <<-DESC
* UI extensions * UI extensions
@ -15,7 +15,7 @@ Pod::Spec.new do |s|
s.requires_arc = true s.requires_arc = true
s.ios.deployment_target = '8.0' s.ios.deployment_target = '8.0'
s.osx.deployment_target = '10.9' s.osx.deployment_target = '10.10'
s.watchos.deployment_target = '2.0' s.watchos.deployment_target = '2.0'
s.tvos.deployment_target = '9.0' s.tvos.deployment_target = '9.0'
@ -25,5 +25,5 @@ Pod::Spec.new do |s|
s.watchos.source_files = 'RxCocoa/iOS/**/*.swift' s.watchos.source_files = 'RxCocoa/iOS/**/*.swift'
s.tvos.source_files = 'RxCocoa/iOS/**/*.swift' s.tvos.source_files = 'RxCocoa/iOS/**/*.swift'
s.dependency 'RxSwift', '~> 2.5' s.dependency 'RxSwift', '~> 3.0.0.alpha.1'
end end

View File

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

View File

@ -54,7 +54,7 @@ public struct ControlEvent<PropertyType> : ControlEventType {
- parameter events: Observable sequence that represents events. - parameter events: Observable sequence that represents events.
- returns: Control event created with a observable sequence of events. - returns: Control event created with a observable sequence of events.
*/ */
public init<Ev: ObservableType where Ev.E == E>(events: Ev) { public init<Ev: ObservableType>(events: Ev) where Ev.E == E {
_events = events.subscribeOn(ConcurrentMainScheduler.instance) _events = events.subscribeOn(ConcurrentMainScheduler.instance)
} }
@ -64,14 +64,14 @@ public struct ControlEvent<PropertyType> : ControlEventType {
- parameter observer: Observer to subscribe to events. - parameter observer: Observer to subscribe to events.
- returns: Disposable object that can be used to unsubscribe the observer from receiving control events. - returns: Disposable object that can be used to unsubscribe the observer from receiving control events.
*/ */
public func subscribe<O : ObserverType where O.E == E>(observer: O) -> Disposable { public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {
return _events.subscribe(observer) return _events.subscribe(observer)
} }
/** /**
- returns: `Observable` interface. - returns: `Observable` interface.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asObservable() -> Observable<E> { public func asObservable() -> Observable<E> {
return _events return _events
} }
@ -79,7 +79,7 @@ public struct ControlEvent<PropertyType> : ControlEventType {
/** /**
- returns: `ControlEvent` interface. - returns: `ControlEvent` interface.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asControlEvent() -> ControlEvent<E> { public func asControlEvent() -> ControlEvent<E> {
return self return self
} }

View File

@ -59,7 +59,7 @@ public struct ControlProperty<PropertyType> : ControlPropertyType {
- returns: Control property created with a observable sequence of values and an observer that enables binding values - returns: Control property created with a observable sequence of values and an observer that enables binding values
to property. to property.
*/ */
public init<V: ObservableType, S: ObserverType where E == V.E, E == S.E>(values: V, valueSink: S) { public init<V: ObservableType, S: ObserverType>(values: V, valueSink: S) where E == V.E, E == S.E {
_values = values.subscribeOn(ConcurrentMainScheduler.instance) _values = values.subscribeOn(ConcurrentMainScheduler.instance)
_valueSink = valueSink.asObserver() _valueSink = valueSink.asObserver()
} }
@ -70,14 +70,14 @@ public struct ControlProperty<PropertyType> : ControlPropertyType {
- parameter observer: Observer to subscribe to property values. - parameter observer: Observer to subscribe to property values.
- returns: Disposable object that can be used to unsubscribe the observer from receiving control property values. - returns: Disposable object that can be used to unsubscribe the observer from receiving control property values.
*/ */
public func subscribe<O : ObserverType where O.E == E>(observer: O) -> Disposable { public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {
return _values.subscribe(observer) return _values.subscribe(observer)
} }
/** /**
- returns: `Observable` interface. - returns: `Observable` interface.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asObservable() -> Observable<E> { public func asObservable() -> Observable<E> {
return _values return _values
} }
@ -85,7 +85,7 @@ public struct ControlProperty<PropertyType> : ControlPropertyType {
/** /**
- returns: `ControlProperty` interface. - returns: `ControlProperty` interface.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asControlProperty() -> ControlProperty<E> { public func asControlProperty() -> ControlProperty<E> {
return self return self
} }
@ -97,13 +97,13 @@ public struct ControlProperty<PropertyType> : ControlPropertyType {
- In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output. - In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output.
- In case sequence completes, nothing happens. - In case sequence completes, nothing happens.
*/ */
public func on(event: Event<E>) { public func on(_ event: Event<E>) {
switch event { switch event {
case .Error(let error): case .error(let error):
bindingErrorToInterface(error) bindingErrorToInterface(error)
case .Next: case .next:
_valueSink.on(event) _valueSink.on(event)
case .Completed: case .completed:
_valueSink.on(event) _valueSink.on(event)
} }
} }

View File

@ -17,7 +17,7 @@ extension ControlEvent {
`ControlEvent` already can't fail, so no special case needs to be handled. `ControlEvent` already can't fail, so no special case needs to be handled.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver() -> Driver<E> { public func asDriver() -> Driver<E> {
return self.asDriver { (error) -> Driver<E> in return self.asDriver { (error) -> Driver<E> in
#if DEBUG #if DEBUG
@ -27,4 +27,4 @@ extension ControlEvent {
#endif #endif
} }
} }
} }

View File

@ -17,7 +17,7 @@ extension ControlProperty {
`ControlProperty` already can't fail, so no special case needs to be handled. `ControlProperty` already can't fail, so no special case needs to be handled.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver() -> Driver<E> { public func asDriver() -> Driver<E> {
return self.asDriver { (error) -> Driver<E> in return self.asDriver { (error) -> Driver<E> in
#if DEBUG #if DEBUG
@ -27,4 +27,4 @@ extension ControlProperty {
#endif #endif
} }
} }
} }

View File

@ -23,9 +23,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType>
(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> E) (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(),
@ -43,9 +43,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType>
(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> E) (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(),
@ -67,9 +67,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, resultSelector: (O1.E, O2.E, O3.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(),
@ -87,9 +87,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, resultSelector: (O1.E, O2.E, O3.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(),
@ -111,9 +111,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(),
@ -131,9 +131,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(),
@ -155,9 +155,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(),
@ -175,9 +175,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(),
@ -199,9 +199,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(),
@ -219,9 +219,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(),
@ -243,9 +243,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(),
@ -263,9 +263,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(),
@ -287,9 +287,9 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType> public static func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(),
@ -307,9 +307,9 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType> public static func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(), source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(),
@ -320,3 +320,4 @@ extension Driver {
} }
} }

View File

@ -22,12 +22,12 @@ extension Driver {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func zip<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joinWithSeparator(", ") %>> public static func zip<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joined(separator: ", ") %>>
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> E) (<%= (Array(1...i).map { "_ source\($0): O\($0)" }).joined(separator: ", ") %>, resultSelector: @escaping (<%= (Array(1...i).map { "O\($0).E" }).joined(separator: ", ") %>) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.zip( let source = Observable.zip(
<%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joinWithSeparator(", ") %>, <%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joined(separator: ", ") %>,
resultSelector: resultSelector resultSelector: resultSelector
) )
@ -42,12 +42,12 @@ extension Driver {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func combineLatest<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joinWithSeparator(", ") %>> public static func combineLatest<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joined(separator: ", ") %>>
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> E) (<%= (Array(1...i).map { "_ source\($0): O\($0)" }).joined(separator: ", ") %>, resultSelector: @escaping (<%= (Array(1...i).map { "O\($0).E" }).joined(separator: ", ") %>) throws -> E)
-> Driver<E> { -> Driver<E> {
let source = Observable.combineLatest( let source = Observable.combineLatest(
<%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joinWithSeparator(", ") %>, <%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joined(separator: ", ") %>,
resultSelector: resultSelector resultSelector: resultSelector
) )
@ -55,4 +55,4 @@ extension Driver {
} }
} }
<% } %> <% } %>

View File

@ -20,8 +20,8 @@ extension DriverConvertibleType {
- parameter selector: A transform function to apply to each source element. - parameter selector: A transform function to apply to each source element.
- returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func map<R>(selector: E -> R) -> Driver<R> { public func map<R>(_ selector: @escaping (E) -> R) -> Driver<R> {
let source = self let source = self
.asObservable() .asObservable()
.map(selector) .map(selector)
@ -37,8 +37,8 @@ extension DriverConvertibleType {
- parameter predicate: A function to test each source element for a condition. - parameter predicate: A function to test each source element for a condition.
- returns: An observable sequence that contains elements from the input sequence that satisfy the condition. - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func filter(predicate: (E) -> Bool) -> Driver<E> { public func filter(_ predicate: @escaping (E) -> Bool) -> Driver<E> {
let source = self let source = self
.asObservable() .asObservable()
.filter(predicate) .filter(predicate)
@ -58,7 +58,7 @@ extension DriverConvertibleType where E : DriverConvertibleType {
- returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func switchLatest() -> Driver<E.E> { public func switchLatest() -> Driver<E.E> {
let source: Observable<E.E> = self let source: Observable<E.E> = self
.asObservable() .asObservable()
@ -80,8 +80,8 @@ extension DriverConvertibleType {
- returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an
Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received. Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func flatMapLatest<R>(selector: (E) -> Driver<R>) public func flatMapLatest<R>(_ selector: @escaping (E) -> Driver<R>)
-> Driver<R> { -> Driver<R> {
let source: Observable<R> = self let source: Observable<R> = self
.asObservable() .asObservable()
@ -100,8 +100,8 @@ extension DriverConvertibleType {
- parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel. - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.
- returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func flatMapFirst<R>(selector: (E) -> Driver<R>) public func flatMapFirst<R>(_ selector: @escaping (E) -> Driver<R>)
-> Driver<R> { -> Driver<R> {
let source: Observable<R> = self let source: Observable<R> = self
.asObservable() .asObservable()
@ -119,11 +119,12 @@ extension DriverConvertibleType {
- parameter eventHandler: Action to invoke for each event in the observable sequence. - parameter eventHandler: Action to invoke for each event in the observable sequence.
- returns: The source sequence with the side-effecting behavior applied. - returns: The source sequence with the side-effecting behavior applied.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func doOn(eventHandler: (Event<E>) -> Void) @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)")
public func doOn(_ eventHandler: @escaping (Event<E>) -> Void)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.doOn(eventHandler) .doOn(eventHandler)
return Driver(source) return Driver(source)
} }
@ -136,8 +137,9 @@ extension DriverConvertibleType {
- parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
- returns: The source sequence with the side-effecting behavior applied. - returns: The source sequence with the side-effecting behavior applied.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func doOn(onNext onNext: (E -> Void)? = nil, onError: (ErrorType -> Void)? = nil, onCompleted: (() -> Void)? = nil) @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)")
public func doOn(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.doOn(onNext: onNext, onError: onError, onCompleted: onCompleted) .doOn(onNext: onNext, onError: onError, onCompleted: onCompleted)
@ -151,10 +153,11 @@ extension DriverConvertibleType {
- parameter onNext: Action to invoke for each element in the observable sequence. - parameter onNext: Action to invoke for each element in the observable sequence.
- returns: The source sequence with the side-effecting behavior applied. - returns: The source sequence with the side-effecting behavior applied.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func doOnNext(onNext: (E -> Void)) @available(*, deprecated, renamed: "do(onNext:)")
public func doOnNext(_ onNext: @escaping (E) -> Void)
-> Driver<E> { -> Driver<E> {
return self.doOn(onNext: onNext) return self.do(onNext: onNext)
} }
/** /**
@ -163,10 +166,30 @@ extension DriverConvertibleType {
- parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
- returns: The source sequence with the side-effecting behavior applied. - returns: The source sequence with the side-effecting behavior applied.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func doOnCompleted(onCompleted: (() -> Void)) @available(*, deprecated, renamed: "do(onCompleted:)")
public func doOnCompleted(_ onCompleted: @escaping () -> Void)
-> Driver<E> { -> Driver<E> {
return self.doOn(onCompleted: onCompleted) return self.do(onCompleted: onCompleted)
}
/**
Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.
- parameter onNext: Action to invoke for each element in the observable sequence.
- parameter onError: Action to invoke upon errored termination of the observable sequence. This callback will never be invoked since driver can't error out.
- parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.
- parameter onSubscribe: Action to invoke before subscribing to source observable sequence.
- parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.
- returns: The source sequence with the side-effecting behavior applied.
*/
// @warn_unused_result(message:"http://git.io/rxs.uo")
public func `do`(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onDispose: (() -> ())? = nil)
-> Driver<E> {
let source = self.asObservable()
.do(onNext: onNext, onError: onError, onCompleted: onCompleted, onSubscribe: onSubscribe, onDispose: onDispose)
return Driver(source)
} }
} }
@ -179,8 +202,8 @@ extension DriverConvertibleType {
- parameter identifier: Identifier that is printed together with event description to standard output. - parameter identifier: Identifier that is printed together with event description to standard output.
- returns: An observable sequence whose events are printed to standard output. - returns: An observable sequence whose events are printed to standard output.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func debug(identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) -> Driver<E> { public func debug(_ identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.debug(identifier, file: file, line: line, function: function) .debug(identifier, file: file, line: line, function: function)
return Driver(source) return Driver(source)
@ -195,7 +218,7 @@ extension DriverConvertibleType where E: Equatable {
- returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence. - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func distinctUntilChanged() public func distinctUntilChanged()
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
@ -213,8 +236,8 @@ extension DriverConvertibleType {
- parameter keySelector: A function to compute the comparison key for each element. - parameter keySelector: A function to compute the comparison key for each element.
- returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func distinctUntilChanged<K: Equatable>(keySelector: (E) -> K) -> Driver<E> { public func distinctUntilChanged<K: Equatable>(_ keySelector: @escaping (E) -> K) -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.distinctUntilChanged(keySelector, comparer: { $0 == $1 }) .distinctUntilChanged(keySelector, comparer: { $0 == $1 })
return Driver(source) return Driver(source)
@ -226,8 +249,8 @@ extension DriverConvertibleType {
- parameter comparer: Equality comparer for computed key values. - parameter comparer: Equality comparer for computed key values.
- returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence. - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func distinctUntilChanged(comparer: (lhs: E, rhs: E) -> Bool) -> Driver<E> { public func distinctUntilChanged(_ comparer: @escaping (E, E) -> Bool) -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.distinctUntilChanged({ $0 }, comparer: comparer) .distinctUntilChanged({ $0 }, comparer: comparer)
return Driver(source) return Driver(source)
@ -240,8 +263,8 @@ extension DriverConvertibleType {
- parameter comparer: Equality comparer for computed key values. - parameter comparer: Equality comparer for computed key values.
- returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func distinctUntilChanged<K>(keySelector: (E) -> K, comparer: (lhs: K, rhs: K) -> Bool) -> Driver<E> { public func distinctUntilChanged<K>(_ keySelector: @escaping (E) -> K, comparer: @escaping (K, K) -> Bool) -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.distinctUntilChanged(keySelector, comparer: comparer) .distinctUntilChanged(keySelector, comparer: comparer)
return Driver(source) return Driver(source)
@ -258,8 +281,8 @@ extension DriverConvertibleType {
- parameter selector: A transform function to apply to each element. - parameter selector: A transform function to apply to each element.
- returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func flatMap<R>(selector: (E) -> Driver<R>) -> Driver<R> { public func flatMap<R>(_ selector: @escaping (E) -> Driver<R>) -> Driver<R> {
let source = self.asObservable() let source = self.asObservable()
.flatMap(selector) .flatMap(selector)
@ -276,7 +299,7 @@ extension DriverConvertibleType where E : DriverConvertibleType {
- parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently. - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.
- returns: The observable sequence that merges the elements of the observable sequences. - returns: The observable sequence that merges the elements of the observable sequences.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func merge() -> Driver<E.E> { public func merge() -> Driver<E.E> {
let source = self.asObservable() let source = self.asObservable()
.map { $0.asDriver() } .map { $0.asDriver() }
@ -289,8 +312,8 @@ extension DriverConvertibleType where E : DriverConvertibleType {
- returns: The observable sequence that merges the elements of the inner sequences. - returns: The observable sequence that merges the elements of the inner sequences.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func merge(maxConcurrent maxConcurrent: Int) public func merge(maxConcurrent: Int)
-> Driver<E.E> { -> Driver<E.E> {
let source = self.asObservable() let source = self.asObservable()
.map { $0.asDriver() } .map { $0.asDriver() }
@ -310,8 +333,8 @@ extension DriverConvertibleType {
- parameter dueTime: Throttling duration for each element. - parameter dueTime: Throttling duration for each element.
- returns: The throttled sequence. - returns: The throttled sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func throttle(dueTime: RxTimeInterval) public func throttle(_ dueTime: RxTimeInterval)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.throttle(dueTime, scheduler: driverObserveOnScheduler) .throttle(dueTime, scheduler: driverObserveOnScheduler)
@ -327,8 +350,8 @@ extension DriverConvertibleType {
- parameter dueTime: Throttling duration for each element. - parameter dueTime: Throttling duration for each element.
- returns: The throttled sequence. - returns: The throttled sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func debounce(dueTime: RxTimeInterval) public func debounce(_ dueTime: RxTimeInterval)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.debounce(dueTime, scheduler: driverObserveOnScheduler) .debounce(dueTime, scheduler: driverObserveOnScheduler)
@ -348,8 +371,8 @@ extension DriverConvertibleType {
- parameter accumulator: An accumulator function to be invoked on each element. - parameter accumulator: An accumulator function to be invoked on each element.
- returns: An observable sequence containing the accumulated values. - returns: An observable sequence containing the accumulated values.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func scan<A>(seed: A, accumulator: (A, E) -> A) public func scan<A>(_ seed: A, accumulator: @escaping (A, E) -> A)
-> Driver<A> { -> Driver<A> {
let source = self.asObservable() let source = self.asObservable()
.scan(seed, accumulator: accumulator) .scan(seed, accumulator: accumulator)
@ -358,29 +381,29 @@ extension DriverConvertibleType {
} }
// MARK: concat // MARK: concat
extension SequenceType where Generator.Element : DriverConvertibleType { extension Sequence where Iterator.Element : DriverConvertibleType {
/** /**
Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
- returns: An observable sequence that contains the elements of each given sequence, in sequential order. - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func concat() public func concat()
-> Driver<Generator.Element.E> { -> Driver<Iterator.Element.E> {
let source = self.lazy.map { $0.asDriver().asObservable() }.concat() let source = self.lazy.map { $0.asDriver().asObservable() }.concat()
return Driver<Generator.Element.E>(source) return Driver<Iterator.Element.E>(source)
} }
} }
extension CollectionType where Generator.Element : DriverConvertibleType { extension Collection where Iterator.Element : DriverConvertibleType {
/** /**
Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.
- returns: An observable sequence that contains the elements of each given sequence, in sequential order. - returns: An observable sequence that contains the elements of each given sequence, in sequential order.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func concat() public func concat()
-> Driver<Generator.Element.E> { -> Driver<Generator.Element.E> {
let source = self.map { $0.asDriver().asObservable() }.concat() let source = self.map { $0.asDriver().asObservable() }.concat()
@ -389,7 +412,7 @@ extension CollectionType where Generator.Element : DriverConvertibleType {
} }
// MARK: zip // MARK: zip
extension CollectionType where Generator.Element : DriverConvertibleType { extension Collection where Iterator.Element : DriverConvertibleType {
/** /**
Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.
@ -397,15 +420,15 @@ extension CollectionType where Generator.Element : DriverConvertibleType {
- parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func zip<R>(resultSelector: [Generator.Element.E] throws -> R) -> Driver<R> { public func zip<R>(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Driver<R> {
let source = self.map { $0.asDriver().asObservable() }.zip(resultSelector) let source = self.map { $0.asDriver().asObservable() }.zip(resultSelector)
return Driver<R>(source) return Driver<R>(source)
} }
} }
// MARK: combineLatest // MARK: combineLatest
extension CollectionType where Generator.Element : DriverConvertibleType { extension Collection where Iterator.Element : DriverConvertibleType {
/** /**
Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
@ -413,8 +436,8 @@ extension CollectionType where Generator.Element : DriverConvertibleType {
- parameter resultSelector: Function to invoke whenever any of the sources produces an element. - parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func combineLatest<R>(resultSelector: [Generator.Element.E] throws -> R) -> Driver<R> { public func combineLatest<R>(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Driver<R> {
let source = self.map { $0.asDriver().asObservable() }.combineLatest(resultSelector) let source = self.map { $0.asDriver().asObservable() }.combineLatest(resultSelector)
return Driver<R>(source) return Driver<R>(source)
} }
@ -430,7 +453,7 @@ extension DriverConvertibleType {
- parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any. - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.
- returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function.
*/ */
public func withLatestFrom<SecondO: DriverConvertibleType, ResultType>(second: SecondO, resultSelector: (E, SecondO.E) -> ResultType) -> Driver<ResultType> { public func withLatestFrom<SecondO: DriverConvertibleType, ResultType>(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> Driver<ResultType> {
let source = self.asObservable() let source = self.asObservable()
.withLatestFrom(second.asDriver(), resultSelector: resultSelector) .withLatestFrom(second.asDriver(), resultSelector: resultSelector)
@ -443,7 +466,7 @@ extension DriverConvertibleType {
- parameter second: Second observable source. - parameter second: Second observable source.
- returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function.
*/ */
public func withLatestFrom<SecondO: DriverConvertibleType>(second: SecondO) -> Driver<SecondO.E> { public func withLatestFrom<SecondO: DriverConvertibleType>(_ second: SecondO) -> Driver<SecondO.E> {
let source = self.asObservable() let source = self.asObservable()
.withLatestFrom(second.asDriver()) .withLatestFrom(second.asDriver())
@ -462,8 +485,8 @@ extension DriverConvertibleType {
- parameter count: The number of elements to skip before returning the remaining elements. - parameter count: The number of elements to skip before returning the remaining elements.
- returns: An observable sequence that contains the elements that occur after the specified index in the input sequence. - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func skip(count: Int) public func skip(_ count: Int)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.skip(count) .skip(count)
@ -482,12 +505,12 @@ extension DriverConvertibleType {
- parameter element: Element to prepend to the specified sequence. - parameter element: Element to prepend to the specified sequence.
- returns: The source sequence prepended with the specified values. - returns: The source sequence prepended with the specified values.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func startWith(element: E) public func startWith(_ element: E)
-> Driver<E> { -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.startWith(element) .startWith(element)
return Driver(source) return Driver(source)
} }
} }

View File

@ -24,9 +24,9 @@ extension DriverConvertibleType {
- parameter observer: Observer that receives events. - parameter observer: Observer that receives events.
- returns: Disposable object that can be used to unsubscribe the observer from the subject. - returns: Disposable object that can be used to unsubscribe the observer from the subject.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func drive<O: ObserverType where O.E == E>(observer: O) -> Disposable { public func drive<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return self.asObservable().subscribe(observer) return self.asObservable().subscribe(observer)
} }
@ -37,9 +37,9 @@ extension DriverConvertibleType {
- parameter variable: Target variable for sequence elements. - parameter variable: Target variable for sequence elements.
- returns: Disposable object that can be used to unsubscribe the observer from the variable. - returns: Disposable object that can be used to unsubscribe the observer from the variable.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func drive(variable: Variable<E>) -> Disposable { public func drive(_ variable: Variable<E>) -> Disposable {
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return drive(onNext: { e in return drive(onNext: { e in
variable.value = e variable.value = e
}) })
@ -52,9 +52,9 @@ extension DriverConvertibleType {
- parameter with: Function used to bind elements from `self`. - parameter with: Function used to bind elements from `self`.
- returns: Object representing subscription. - returns: Object representing subscription.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func drive<R>(transformation: Observable<E> -> R) -> R { public func drive<R>(_ transformation: (Observable<E>) -> R) -> R {
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return transformation(self.asObservable()) return transformation(self.asObservable())
} }
@ -72,9 +72,9 @@ extension DriverConvertibleType {
- parameter curriedArgument: Final argument passed to `binder` to finish binding process. - parameter curriedArgument: Final argument passed to `binder` to finish binding process.
- returns: Object representing subscription. - returns: Object representing subscription.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func drive<R1, R2>(with: Observable<E> -> R1 -> R2, curriedArgument: R1) -> R2 { public func drive<R1, R2>(_ with: (Observable<E>) -> (R1) -> R2, curriedArgument: R1) -> R2 {
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return with(self.asObservable())(curriedArgument) return with(self.asObservable())(curriedArgument)
} }
@ -91,9 +91,9 @@ extension DriverConvertibleType {
gracefully completed, errored, or if the generation is cancelled by disposing subscription) gracefully completed, errored, or if the generation is cancelled by disposing subscription)
- returns: Subscription object used to unsubscribe from the observable sequence. - returns: Subscription object used to unsubscribe from the observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func drive(onNext onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { public func drive(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable {
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed) return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)
} }
@ -104,10 +104,11 @@ extension DriverConvertibleType {
- parameter onNext: Action to invoke for each element in the observable sequence. - parameter onNext: Action to invoke for each element in the observable sequence.
- returns: Subscription object used to unsubscribe from the observable sequence. - returns: Subscription object used to unsubscribe from the observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message:"http://git.io/rxs.ud")
public func driveNext(onNext: E -> Void) -> Disposable { @available(*, deprecated, renamed: "drive(onNext:)")
MainScheduler.ensureExecutingOnScheduler(driverErrorMessage) public func driveNext(_ onNext: @escaping (E) -> Void) -> Disposable {
return self.asObservable().subscribeNext(onNext) MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage)
return self.asObservable().subscribe(onNext: onNext)
} }
} }

View File

@ -19,12 +19,12 @@ public protocol DriverConvertibleType : ObservableConvertibleType {
/** /**
Converts self to `Driver`. Converts self to `Driver`.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
func asDriver() -> Driver<E> func asDriver() -> Driver<E>
} }
extension DriverConvertibleType { extension DriverConvertibleType {
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asObservable() -> Observable<E> { public func asObservable() -> Observable<E> {
return asDriver().asObservable() return asDriver().asObservable()
} }
@ -75,7 +75,7 @@ public struct Driver<Element> : DriverConvertibleType {
/** /**
- returns: Built observable sequence. - returns: Built observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asObservable() -> Observable<E> { public func asObservable() -> Observable<E> {
return _source return _source
} }
@ -83,7 +83,7 @@ public struct Driver<Element> : DriverConvertibleType {
/** /**
- returns: `self` - returns: `self`
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver() -> Driver<E> { public func asDriver() -> Driver<E> {
return self return self
} }
@ -97,9 +97,9 @@ extension Driver {
- returns: An observable sequence with no elements. - returns: An observable sequence with no elements.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func empty() -> Driver<E> { public static func empty() -> Driver<E> {
return Driver(raw: Observable.empty().subscribeOn(driverSubscribeOnScheduler)) return Driver(Observable.empty().subscribeOn(driverSubscribeOnScheduler))
} }
/** /**
@ -107,9 +107,9 @@ extension Driver {
- returns: An observable sequence whose observers will never get called. - returns: An observable sequence whose observers will never get called.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func never() -> Driver<E> { public static func never() -> Driver<E> {
return Driver(raw: Observable.never().subscribeOn(driverSubscribeOnScheduler)) return Driver(Observable.never().subscribeOn(driverSubscribeOnScheduler))
} }
/** /**
@ -118,9 +118,9 @@ extension Driver {
- parameter element: Single element in the resulting observable sequence. - parameter element: Single element in the resulting observable sequence.
- returns: An observable sequence containing the single specified element. - returns: An observable sequence containing the single specified element.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func just(element: E) -> Driver<E> { public static func just(_ element: E) -> Driver<E> {
return Driver(raw: Observable.just(element).subscribeOn(driverSubscribeOnScheduler)) return Driver(Observable.just(element).subscribeOn(driverSubscribeOnScheduler))
} }
/** /**
@ -129,8 +129,8 @@ extension Driver {
- parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.
- returns: An observable sequence whose observers trigger an invocation of the given observable factory function. - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func deferred(observableFactory: () -> Driver<E>) public static func deferred(_ observableFactory: @escaping () -> Driver<E>)
-> Driver<E> { -> Driver<E> {
return Driver(Observable.deferred { observableFactory().asObservable() }) return Driver(Observable.deferred { observableFactory().asObservable() })
} }
@ -143,14 +143,14 @@ extension Driver {
- parameter elements: Elements to generate. - parameter elements: Elements to generate.
- returns: The observable sequence whose elements are pulled from the given arguments. - returns: The observable sequence whose elements are pulled from the given arguments.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func of(elements: E ...) -> Driver<E> { public static func of(_ elements: E ...) -> Driver<E> {
let source = elements.toObservable(driverSubscribeOnScheduler) let source = Observable.from(elements, scheduler: driverSubscribeOnScheduler)
return Driver(raw: source) return Driver(raw: source)
} }
} }
extension Driver where Element : SignedIntegerType { extension Driver where Element : SignedInteger {
/** /**
Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages. Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.
@ -159,8 +159,8 @@ extension Driver where Element : SignedIntegerType {
- parameter period: Period for producing the values in the resulting sequence. - parameter period: Period for producing the values in the resulting sequence.
- returns: An observable sequence that produces a value after each period. - returns: An observable sequence that produces a value after each period.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func interval(period: RxTimeInterval) public static func interval(_ period: RxTimeInterval)
-> Driver<E> { -> Driver<E> {
return Driver(Observable.interval(period, scheduler: driverObserveOnScheduler)) return Driver(Observable.interval(period, scheduler: driverObserveOnScheduler))
} }
@ -168,7 +168,7 @@ extension Driver where Element : SignedIntegerType {
// MARK: timer // MARK: timer
extension Driver where Element: SignedIntegerType { extension Driver where Element: SignedInteger {
/** /**
Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.
@ -178,8 +178,8 @@ extension Driver where Element: SignedIntegerType {
- parameter period: Period to produce subsequent values. - parameter period: Period to produce subsequent values.
- returns: An observable sequence that produces a value after due time has elapsed and then each period. - returns: An observable sequence that produces a value after due time has elapsed and then each period.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public static func timer(dueTime: RxTimeInterval, period: RxTimeInterval) public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval)
-> Driver<E> { -> Driver<E> {
return Driver(Observable.timer(dueTime, period: period, scheduler: driverObserveOnScheduler)) return Driver(Observable.timer(dueTime, period: period, scheduler: driverObserveOnScheduler))
} }
@ -191,7 +191,7 @@ extension Driver where Element: SignedIntegerType {
**This shouldn't be used in normal release builds.** **This shouldn't be used in normal release builds.**
*/ */
public func driveOnScheduler(scheduler: SchedulerType, action: () -> ()) { public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) {
let originalObserveOnScheduler = driverObserveOnScheduler let originalObserveOnScheduler = driverObserveOnScheduler
let originalSubscribeOnScheduler = driverSubscribeOnScheduler let originalSubscribeOnScheduler = driverSubscribeOnScheduler
@ -209,7 +209,7 @@ public func driveOnScheduler(scheduler: SchedulerType, action: () -> ()) {
driverSubscribeOnScheduler = originalSubscribeOnScheduler driverSubscribeOnScheduler = originalSubscribeOnScheduler
} }
func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(scheduler: SchedulerType) { func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: SchedulerType) {
let a: Int32 = 1 let a: Int32 = 1
let b = 314 + Int32(arc4random() & 1) let b = 314 + Int32(arc4random() & 1)
if a == b { if a == b {

View File

@ -18,8 +18,8 @@ extension ObservableConvertibleType {
- parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.
- returns: Driving observable sequence. - returns: Driving observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver(onErrorJustReturn onErrorJustReturn: E) -> Driver<E> { public func asDriver(onErrorJustReturn: E) -> Driver<E> {
let source = self let source = self
.asObservable() .asObservable()
.observeOn(driverObserveOnScheduler) .observeOn(driverObserveOnScheduler)
@ -33,8 +33,8 @@ extension ObservableConvertibleType {
- parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error. - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error.
- returns: Driving observable sequence. - returns: Driving observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver(onErrorDriveWith onErrorDriveWith: Driver<E>) -> Driver<E> { public func asDriver(onErrorDriveWith: Driver<E>) -> Driver<E> {
let source = self let source = self
.asObservable() .asObservable()
.observeOn(driverObserveOnScheduler) .observeOn(driverObserveOnScheduler)
@ -50,14 +50,14 @@ extension ObservableConvertibleType {
- parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.
- returns: Driving observable sequence. - returns: Driving observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver(onErrorRecover onErrorRecover: (error: ErrorType) -> Driver<E>) -> Driver<E> { public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver<E>) -> Driver<E> {
let source = self let source = self
.asObservable() .asObservable()
.observeOn(driverObserveOnScheduler) .observeOn(driverObserveOnScheduler)
.catchError { error in .catchError { error in
onErrorRecover(error: error).asObservable() onErrorRecover(error).asObservable()
} }
return Driver(source) return Driver(source)
} }
} }

View File

@ -17,10 +17,10 @@ extension Variable {
- returns: Driving observable sequence. - returns: Driving observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func asDriver() -> Driver<E> { public func asDriver() -> Driver<E> {
let source = self.asObservable() let source = self.asObservable()
.observeOn(driverObserveOnScheduler) .observeOn(driverObserveOnScheduler)
return Driver(source) return Driver(source)
} }
} }

View File

@ -18,7 +18,7 @@ Observer that enforces interface binding rules:
`UIBindingObserver` doesn't retain target interface and in case owned interface element is released, element isn't bound. `UIBindingObserver` doesn't retain target interface and in case owned interface element is released, element isn't bound.
*/ */
public class UIBindingObserver<UIElementType, Value where UIElementType: AnyObject> : ObserverType { public class UIBindingObserver<UIElementType, Value> : ObserverType where UIElementType: AnyObject {
public typealias E = Value public typealias E = Value
weak var UIElement: UIElementType? weak var UIElement: UIElementType?
@ -28,7 +28,7 @@ public class UIBindingObserver<UIElementType, Value where UIElementType: AnyObje
/** /**
Initializes `ViewBindingObserver` using Initializes `ViewBindingObserver` using
*/ */
public init(UIElement: UIElementType, binding: (UIElementType, Value) -> Void) { public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) {
self.UIElement = UIElement self.UIElement = UIElement
self.binding = binding self.binding = binding
} }
@ -36,17 +36,17 @@ public class UIBindingObserver<UIElementType, Value where UIElementType: AnyObje
/** /**
Binds next element to owner view as described in `binding`. Binds next element to owner view as described in `binding`.
*/ */
public func on(event: Event<Value>) { public func on(_ event: Event<Value>) {
MainScheduler.ensureExecutingOnScheduler("Element can be bound to user interface only on MainThread.") MainScheduler.ensureExecutingOnScheduler(errorMessage: "Element can be bound to user interface only on MainThread.")
switch event { switch event {
case .Next(let element): case .next(let element):
if let view = self.UIElement { if let view = self.UIElement {
binding(view, element) binding(view, element)
} }
case .Error(let error): case .error(let error):
bindingErrorToInterface(error) bindingErrorToInterface(error)
case .Completed: case .completed:
break break
} }
} }

View File

@ -19,7 +19,7 @@ Base class for `DelegateProxyType` protocol.
This implementation is not thread safe and can be used only from one thread (Main thread). This implementation is not thread safe and can be used only from one thread (Main thread).
*/ */
public class DelegateProxy : _RXDelegateProxy { open class DelegateProxy : _RXDelegateProxy {
private var subjectsForSelector = [Selector: PublishSubject<[AnyObject]>]() private var subjectsForSelector = [Selector: PublishSubject<[AnyObject]>]()
@ -66,15 +66,15 @@ public class DelegateProxy : _RXDelegateProxy {
let internalSubject = PublishSubject<CGPoint> let internalSubject = PublishSubject<CGPoint>
public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool {
internalSubject.on(.Next(arg1)) internalSubject.on(.next(arg1))
return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue
} }
.... ....
// reactive property implementation in a real class (`UIScrollView`) // reactive property implementation in a real class (`UIScrollView`)
public var rx_property: Observable<CGPoint> { public var property: Observable<CGPoint> {
let proxy = RxScrollViewDelegateProxy.proxyForObject(self) let proxy = RxScrollViewDelegateProxy.proxyForObject(base)
return proxy.internalSubject.asObservable() return proxy.internalSubject.asObservable()
} }
@ -85,12 +85,12 @@ public class DelegateProxy : _RXDelegateProxy {
- parameter selector: Selector used to filter observed invocations of delegate methods. - parameter selector: Selector used to filter observed invocations of delegate methods.
- returns: Observable sequence of arguments passed to `selector` method. - returns: Observable sequence of arguments passed to `selector` method.
*/ */
public func observe(selector: Selector) -> Observable<[AnyObject]> { public func observe(_ selector: Selector) -> Observable<[AnyObject]> {
if hasWiredImplementationForSelector(selector) { if hasWiredImplementation(for: selector) {
print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.")
} }
if !self.respondsToSelector(selector) { if !self.responds(to: selector) {
rxFatalError("This class doesn't respond to selector \(selector)") rxFatalError("This class doesn't respond to selector \(selector)")
} }
@ -108,8 +108,8 @@ public class DelegateProxy : _RXDelegateProxy {
// proxy // proxy
public override func interceptedSelector(selector: Selector, withArguments arguments: [AnyObject]!) { open override func interceptedSelector(_ selector: Selector, withArguments arguments: [Any]) {
subjectsForSelector[selector]?.on(.Next(arguments)) subjectsForSelector[selector]?.on(.next(arguments as [AnyObject]))
} }
/** /**
@ -117,7 +117,7 @@ public class DelegateProxy : _RXDelegateProxy {
- returns: Associated object tag. - returns: Associated object tag.
*/ */
public class func delegateAssociatedObjectTag() -> UnsafePointer<Void> { public class func delegateAssociatedObjectTag() -> UnsafeRawPointer {
return _pointer(&delegateAssociatedTag) return _pointer(&delegateAssociatedTag)
} }
@ -126,7 +126,7 @@ public class DelegateProxy : _RXDelegateProxy {
- returns: Initialized instance of `self`. - returns: Initialized instance of `self`.
*/ */
public class func createProxyForObject(object: AnyObject) -> AnyObject { public class func createProxyForObject(_ object: AnyObject) -> AnyObject {
return self.init(parentObject: object) return self.init(parentObject: object)
} }
@ -136,9 +136,9 @@ public class DelegateProxy : _RXDelegateProxy {
- parameter object: Object that can have assigned delegate proxy. - parameter object: Object that can have assigned delegate proxy.
- returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned.
*/ */
public class func assignedProxyFor(object: AnyObject) -> AnyObject? { public class func assignedProxyFor(_ object: AnyObject) -> AnyObject? {
let maybeDelegate: AnyObject? = objc_getAssociatedObject(object, self.delegateAssociatedObjectTag()) let maybeDelegate = objc_getAssociatedObject(object, self.delegateAssociatedObjectTag())
return castOptionalOrFatalError(maybeDelegate) return castOptionalOrFatalError(maybeDelegate.map { $0 as AnyObject })
} }
/** /**
@ -147,8 +147,8 @@ public class DelegateProxy : _RXDelegateProxy {
- parameter object: Object that can have assigned delegate proxy. - parameter object: Object that can have assigned delegate proxy.
- parameter proxy: Delegate proxy object to assign to `object`. - parameter proxy: Delegate proxy object to assign to `object`.
*/ */
public class func assignProxy(proxy: AnyObject, toObject object: AnyObject) { public class func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) {
precondition(proxy.isKindOfClass(self.classForCoder())) precondition(proxy.isKind(of: self.classForCoder()))
objc_setAssociatedObject(object, self.delegateAssociatedObjectTag(), proxy, .OBJC_ASSOCIATION_RETAIN) objc_setAssociatedObject(object, self.delegateAssociatedObjectTag(), proxy, .OBJC_ASSOCIATION_RETAIN)
} }
@ -160,8 +160,8 @@ public class DelegateProxy : _RXDelegateProxy {
- parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.
- parameter retainDelegate: Should `self` retain `forwardToDelegate`. - parameter retainDelegate: Should `self` retain `forwardToDelegate`.
*/ */
public func setForwardToDelegate(delegate: AnyObject?, retainDelegate: Bool) { public func setForwardToDelegate(_ delegate: AnyObject?, retainDelegate: Bool) {
self._setForwardToDelegate(delegate, retainDelegate: retainDelegate) self._setForward(toDelegate: delegate, retainDelegate: retainDelegate)
} }
/** /**
@ -176,7 +176,7 @@ public class DelegateProxy : _RXDelegateProxy {
deinit { deinit {
for v in subjectsForSelector.values { for v in subjectsForSelector.values {
v.on(.Completed) v.on(.completed)
} }
#if TRACE_RESOURCES #if TRACE_RESOURCES
OSAtomicDecrement32(&resourceCount) OSAtomicDecrement32(&resourceCount)
@ -185,7 +185,7 @@ public class DelegateProxy : _RXDelegateProxy {
// MARK: Pointer // MARK: Pointer
class func _pointer(p: UnsafePointer<Void>) -> UnsafePointer<Void> { class func _pointer(_ p: UnsafeRawPointer) -> UnsafeRawPointer {
return p return p
} }
} }

View File

@ -69,8 +69,8 @@ every view has a corresponding delegate virtual factory method.
In case of UITableView / UIScrollView, there is In case of UITableView / UIScrollView, there is
extension UIScrollView { extension UIScrollView {
public func rx_createDelegateProxy() -> RxScrollViewDelegateProxy { public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
return RxScrollViewDelegateProxy(parentObject: self) return RxScrollViewDelegateProxy(parentObject: base)
} }
.... ....
@ -78,7 +78,7 @@ In case of UITableView / UIScrollView, there is
and override in UITableView and override in UITableView
extension UITableView { extension UITableView {
public override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy { public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy {
.... ....
@ -87,7 +87,7 @@ public protocol DelegateProxyType : AnyObject {
/** /**
Creates new proxy for target object. Creates new proxy for target object.
*/ */
static func createProxyForObject(object: AnyObject) -> AnyObject static func createProxyForObject(_ object: AnyObject) -> AnyObject
/** /**
Returns assigned proxy for object. Returns assigned proxy for object.
@ -95,7 +95,7 @@ public protocol DelegateProxyType : AnyObject {
- parameter object: Object that can have assigned delegate proxy. - parameter object: Object that can have assigned delegate proxy.
- returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned.
*/ */
static func assignedProxyFor(object: AnyObject) -> AnyObject? static func assignedProxyFor(_ object: AnyObject) -> AnyObject?
/** /**
Assigns proxy to object. Assigns proxy to object.
@ -103,7 +103,7 @@ public protocol DelegateProxyType : AnyObject {
- parameter object: Object that can have assigned delegate proxy. - parameter object: Object that can have assigned delegate proxy.
- parameter proxy: Delegate proxy object to assign to `object`. - parameter proxy: Delegate proxy object to assign to `object`.
*/ */
static func assignProxy(proxy: AnyObject, toObject object: AnyObject) static func assignProxy(_ proxy: AnyObject, toObject object: AnyObject)
/** /**
Returns designated delegate property for object. Returns designated delegate property for object.
@ -115,7 +115,7 @@ public protocol DelegateProxyType : AnyObject {
- parameter object: Object that has delegate property. - parameter object: Object that has delegate property.
- returns: Value of delegate property. - returns: Value of delegate property.
*/ */
static func currentDelegateFor(object: AnyObject) -> AnyObject? static func currentDelegateFor(_ object: AnyObject) -> AnyObject?
/** /**
Sets designated delegate property for object. Sets designated delegate property for object.
@ -127,7 +127,7 @@ public protocol DelegateProxyType : AnyObject {
- parameter toObject: Object that has delegate property. - parameter toObject: Object that has delegate property.
- parameter delegate: Delegate value. - parameter delegate: Delegate value.
*/ */
static func setCurrentDelegate(delegate: AnyObject?, toObject object: AnyObject) static func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject)
/** /**
Returns reference of normal delegate that receives all forwarded messages Returns reference of normal delegate that receives all forwarded messages
@ -144,11 +144,11 @@ public protocol DelegateProxyType : AnyObject {
- parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.
- parameter retainDelegate: Should `self` retain `forwardToDelegate`. - parameter retainDelegate: Should `self` retain `forwardToDelegate`.
*/ */
func setForwardToDelegate(forwardToDelegate: AnyObject?, retainDelegate: Bool) func setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool)
} }
@available(*, deprecated=2.5, renamed="DelegateProxyType.proxyForObject", message="You can just use normal static protocol extension. E.g. `RxScrollViewDelegateProxy.proxyForObject`") @available(*, deprecated:2.5, renamed:"DelegateProxyType.proxyForObject", message:"You can just use normal static protocol extension. E.g. `RxScrollViewDelegateProxy.proxyForObject`")
public func proxyForObject<P: DelegateProxyType>(type: P.Type, _ object: AnyObject) -> P { public func proxyForObject<P: DelegateProxyType>(_ type: P.Type, _ object: AnyObject) -> P {
return P.proxyForObject(object) return P.proxyForObject(object)
} }
@ -160,37 +160,38 @@ extension DelegateProxyType {
- returns: Installed instance of delegate proxy. - returns: Installed instance of delegate proxy.
extension UISearchBar { extension Reactive where Base: UISearchBar {
public var rx_delegate: DelegateProxy { public var delegate: DelegateProxy {
return RxSearchBarDelegateProxy.proxyForObject(self) return RxSearchBarDelegateProxy.proxyForObject(base)
} }
public var rx_text: ControlProperty<String> { public var text: ControlProperty<String> {
let source: Observable<String> = self.rx_delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) let source: Observable<String> = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))
... ...
} }
} }
*/ */
public static func proxyForObject(object: AnyObject) -> Self { public static func proxyForObject(_ object: AnyObject) -> Self {
MainScheduler.ensureExecutingOnScheduler() MainScheduler.ensureExecutingOnScheduler()
let maybeProxy = Self.assignedProxyFor(object) as? Self let maybeProxy = Self.assignedProxyFor(object) as? Self
let proxy: Self let proxy: Self
if maybeProxy == nil { if let existingProxy = maybeProxy {
proxy = existingProxy
}
else {
proxy = Self.createProxyForObject(object) as! Self proxy = Self.createProxyForObject(object) as! Self
Self.assignProxy(proxy, toObject: object) Self.assignProxy(proxy, toObject: object)
assert(Self.assignedProxyFor(object) === proxy) assert(Self.assignedProxyFor(object) === proxy)
} }
else {
proxy = maybeProxy!
}
let currentDelegate: AnyObject? = Self.currentDelegateFor(object) let currentDelegate: AnyObject? = Self.currentDelegateFor(object)
if currentDelegate !== proxy { if currentDelegate !== proxy {
proxy.setForwardToDelegate(currentDelegate, retainDelegate: false) proxy.setForwardToDelegate(currentDelegate, retainDelegate: false)
assert(proxy.forwardToDelegate() === currentDelegate)
Self.setCurrentDelegate(proxy, toObject: object) Self.setCurrentDelegate(proxy, toObject: object)
assert(Self.currentDelegateFor(object) === proxy) assert(Self.currentDelegateFor(object) === proxy)
assert(proxy.forwardToDelegate() === currentDelegate) assert(proxy.forwardToDelegate() === currentDelegate)
@ -208,7 +209,7 @@ extension DelegateProxyType {
- parameter onProxyForObject: Object that has `delegate` property. - parameter onProxyForObject: Object that has `delegate` property.
- returns: Disposable object that can be used to clear forward delegate. - returns: Disposable object that can be used to clear forward delegate.
*/ */
public static func installForwardDelegate(forwardDelegate: AnyObject, retainDelegate: Bool, onProxyForObject object: AnyObject) -> Disposable { public static func installForwardDelegate(_ forwardDelegate: AnyObject, retainDelegate: Bool, onProxyForObject object: AnyObject) -> Disposable {
weak var weakForwardDelegate: AnyObject? = forwardDelegate weak var weakForwardDelegate: AnyObject? = forwardDelegate
let proxy = Self.proxyForObject(object) let proxy = Self.proxyForObject(object)
@ -226,9 +227,9 @@ extension DelegateProxyType {
Self.setCurrentDelegate(nil, toObject: object) Self.setCurrentDelegate(nil, toObject: object)
Self.setCurrentDelegate(proxy, toObject: object) Self.setCurrentDelegate(proxy, toObject: object)
assert(proxy.forwardToDelegate() === forwardDelegate, "Setting of delegate failed") assert(proxy.forwardToDelegate() === forwardDelegate, "Setting of delegate failed:\ncurrent:\n\(proxy.forwardToDelegate())\nexpected:\n\(forwardDelegate)")
return AnonymousDisposable { return Disposables.create {
MainScheduler.ensureExecutingOnScheduler() MainScheduler.ensureExecutingOnScheduler()
let delegate: AnyObject? = weakForwardDelegate let delegate: AnyObject? = weakForwardDelegate
@ -241,13 +242,17 @@ extension DelegateProxyType {
} }
extension ObservableType { extension ObservableType {
func subscribeProxyDataSourceForObject<P: DelegateProxyType>(object: AnyObject, dataSource: AnyObject, retainDataSource: Bool, binding: (P, Event<E>) -> Void) func subscribeProxyDataSource<P: DelegateProxyType>(ofObject object: AnyObject, dataSource: AnyObject, retainDataSource: Bool, binding: @escaping (P, Event<E>) -> Void)
-> Disposable { -> Disposable {
let proxy = P.proxyForObject(object) let proxy = P.proxyForObject(object)
let disposable = P.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object) let disposable = P.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object)
let subscription = self.asObservable() let subscription = self.asObservable()
// source can never end, otherwise it would release the subscriber .catchError { error in
bindingErrorToInterface(error)
return Observable.empty()
}
// source can never end, otherwise it would release the subscriber, and deallocate the data source
.concat(Observable.never()) .concat(Observable.never())
.subscribe { [weak object] (event: Event<E>) in .subscribe { [weak object] (event: Event<E>) in
MainScheduler.ensureExecutingOnScheduler() MainScheduler.ensureExecutingOnScheduler()
@ -259,16 +264,16 @@ extension ObservableType {
binding(proxy, event) binding(proxy, event)
switch event { switch event {
case .Error(let error): case .error(let error):
bindingErrorToInterface(error) bindingErrorToInterface(error)
disposable.dispose() disposable.dispose()
case .Completed: case .completed:
disposable.dispose() disposable.dispose()
default: default:
break break
} }
} }
return StableCompositeDisposable.create(subscription, disposable) return Disposables.create(subscription, disposable)
} }
} }

View File

@ -15,7 +15,7 @@ extension Int : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.integerValue) self.init(KVOValue.int32Value)
} }
} }
@ -26,7 +26,7 @@ extension Int32 : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.intValue) self.init(KVOValue.int32Value)
} }
} }
@ -37,7 +37,7 @@ extension Int64 : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.longLongValue) self.init(KVOValue.int64Value)
} }
} }
@ -48,7 +48,7 @@ extension UInt : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.unsignedLongValue) self.init(KVOValue.uintValue)
} }
} }
@ -59,7 +59,7 @@ extension UInt32 : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.unsignedIntValue) self.init(KVOValue.uint32Value)
} }
} }
@ -70,7 +70,7 @@ extension UInt64 : KVORepresentable {
Constructs `Self` using KVO value. Constructs `Self` using KVO value.
*/ */
public init?(KVOValue: KVOType) { public init?(KVOValue: KVOType) {
self.init(KVOValue.unsignedLongLongValue) self.init(KVOValue.uint64Value)
} }
} }
@ -90,4 +90,4 @@ extension RawRepresentable where RawValue: KVORepresentable {
self.init(rawValue: rawValue) self.init(rawValue: rawValue)
} }
} }

View File

@ -12,7 +12,7 @@ import Foundation
Simple logging settings for RxCocoa library. Simple logging settings for RxCocoa library.
*/ */
public struct Logging { public struct Logging {
public typealias LogURLRequest = (NSURLRequest) -> Bool public typealias LogURLRequest = (URLRequest) -> Bool
/** /**
Log URL requests to standard output in curl format. Log URL requests to standard output in curl format.
@ -24,4 +24,4 @@ public struct Logging {
return false return false
#endif #endif
} }
} }

View File

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

View File

@ -22,8 +22,8 @@ extension ObservableType {
- parameter observer: Observer that receives events. - parameter observer: Observer that receives events.
- returns: Disposable object that can be used to unsubscribe the observer. - returns: Disposable object that can be used to unsubscribe the observer.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message: "http://git.io/rxs.ud")
public func bindTo<O: ObserverType where O.E == E>(observer: O) -> Disposable { public func bindTo<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
return self.subscribe(observer) return self.subscribe(observer)
} }
@ -36,20 +36,20 @@ extension ObservableType {
- parameter variable: Target variable for sequence elements. - parameter variable: Target variable for sequence elements.
- returns: Disposable object that can be used to unsubscribe the observer. - returns: Disposable object that can be used to unsubscribe the observer.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message: "http://git.io/rxs.ud")
public func bindTo(variable: Variable<E>) -> Disposable { public func bindTo(_ variable: Variable<E>) -> Disposable {
return subscribe { e in return subscribe { e in
switch e { switch e {
case let .Next(element): case let .next(element):
variable.value = element variable.value = element
case let .Error(error): case let .error(error):
let error = "Binding error to variable: \(error)" let error = "Binding error to variable: \(error)"
#if DEBUG #if DEBUG
rxFatalError(error) rxFatalError(error)
#else #else
print(error) print(error)
#endif #endif
case .Completed: case .completed:
break break
} }
} }
@ -61,8 +61,8 @@ extension ObservableType {
- parameter binder: Function used to bind elements from `self`. - parameter binder: Function used to bind elements from `self`.
- returns: Object representing subscription. - returns: Object representing subscription.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message: "http://git.io/rxs.ud")
public func bindTo<R>(binder: Self -> R) -> R { public func bindTo<R>(_ binder: (Self) -> R) -> R {
return binder(self) return binder(self)
} }
@ -78,8 +78,8 @@ extension ObservableType {
- parameter curriedArgument: Final argument passed to `binder` to finish binding process. - parameter curriedArgument: Final argument passed to `binder` to finish binding process.
- returns: Object representing subscription. - returns: Object representing subscription.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message: "http://git.io/rxs.ud")
public func bindTo<R1, R2>(binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 { public func bindTo<R1, R2>(_ binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {
return binder(self)(curriedArgument) return binder(self)(curriedArgument)
} }
@ -93,8 +93,8 @@ extension ObservableType {
- parameter onNext: Action to invoke for each element in the observable sequence. - parameter onNext: Action to invoke for each element in the observable sequence.
- returns: Subscription object used to unsubscribe from the observable sequence. - returns: Subscription object used to unsubscribe from the observable sequence.
*/ */
@warn_unused_result(message="http://git.io/rxs.ud") // @warn_unused_result(message: "http://git.io/rxs.ud")
public func bindNext(onNext: E -> Void) -> Disposable { public func bindNext(_ onNext: @escaping (E) -> Void) -> Disposable {
return subscribe(onNext: onNext, onError: { error in return subscribe(onNext: onNext, onError: { error in
let error = "Binding error: \(error)" let error = "Binding error: \(error)"
#if DEBUG #if DEBUG

View File

@ -45,9 +45,9 @@ class ControlTarget: RxTarget {
super.init() super.init()
control.addTarget(self, action: selector, forControlEvents: controlEvents) control.addTarget(self, action: selector, for: controlEvents)
let method = self.methodForSelector(selector) let method = self.method(for: selector)
if method == nil { if method == nil {
rxFatalError("Can't find method") rxFatalError("Can't find method")
} }
@ -64,15 +64,15 @@ class ControlTarget: RxTarget {
control.target = self control.target = self
control.action = selector control.action = selector
let method = self.methodForSelector(selector) let method = self.method(for: selector)
if method == nil { if method == nil {
rxFatalError("Can't find method") rxFatalError("Can't find method")
} }
} }
#endif #endif
func eventHandler(sender: Control!) { func eventHandler(_ sender: Control!) {
if let callback = self.callback, control = self.control { if let callback = self.callback, let control = self.control {
callback(control) callback(control)
} }
} }
@ -80,7 +80,7 @@ class ControlTarget: RxTarget {
override func dispose() { override func dispose() {
super.dispose() super.dispose()
#if os(iOS) || os(tvOS) #if os(iOS) || os(tvOS)
self.control?.removeTarget(self, action: self.selector, forControlEvents: self.controlEvents) self.control?.removeTarget(self, action: self.selector, for: self.controlEvents)
#elseif os(OSX) #elseif os(OSX)
self.control?.target = nil self.control?.target = nil
self.control?.action = nil self.control?.action = nil

View File

@ -12,13 +12,13 @@ import RxSwift
#endif #endif
class DeallocObservable { class DeallocObservable {
let _subject = ReplaySubject<Void>.create(bufferSize: 1) let _subject = ReplaySubject<Void>.create(bufferSize:1)
init() { init() {
} }
deinit { deinit {
_subject.on(.Next(())) _subject.on(.next(()))
_subject.on(.Completed) _subject.on(.completed)
} }
} }

View File

@ -33,29 +33,29 @@ class KVOObservable<Element>
} }
} }
func subscribe<O : ObserverType where O.E == Element?>(observer: O) -> Disposable { func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element? {
let observer = KVOObserver(parent: self) { (value) in let observer = KVOObserver(parent: self) { (value) in
if value as? NSNull != nil { if value as? NSNull != nil {
observer.on(.Next(nil)) observer.on(.next(nil))
return return
} }
observer.on(.Next(value as? Element)) observer.on(.next(value as? Element))
} }
return AnonymousDisposable(observer.dispose) return Disposables.create(with: observer.dispose)
} }
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
func observeWeaklyKeyPathFor(target: NSObject, keyPath: String, options: NSKeyValueObservingOptions) -> Observable<AnyObject?> { func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: NSKeyValueObservingOptions) -> Observable<AnyObject?> {
let components = keyPath.componentsSeparatedByString(".").filter { $0 != "self" } let components = keyPath.components(separatedBy: ".").filter { $0 != "self" }
let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options) let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options)
.finishWithNilWhenDealloc(target) .finishWithNilWhenDealloc(target)
if !options.intersect(.Initial).isEmpty { if !options.intersection(.initial).isEmpty {
return observable return observable
} }
else { else {
@ -68,14 +68,14 @@ func observeWeaklyKeyPathFor(target: NSObject, keyPath: String, options: NSKeyVa
// Identifiers can't contain `,`, so the only place where `,` can appear // Identifiers can't contain `,`, so the only place where `,` can appear
// is as a delimiter. // is as a delimiter.
// This means there is `W` as element in an array of property attributes. // This means there is `W` as element in an array of property attributes.
func isWeakProperty(properyRuntimeInfo: String) -> Bool { func isWeakProperty(_ properyRuntimeInfo: String) -> Bool {
return properyRuntimeInfo.rangeOfString(",W,") != nil return properyRuntimeInfo.range(of: ",W,") != nil
} }
extension ObservableType where E == AnyObject? { extension ObservableType where E == AnyObject? {
func finishWithNilWhenDealloc(target: NSObject) func finishWithNilWhenDealloc(_ target: NSObject)
-> Observable<AnyObject?> { -> Observable<AnyObject?> {
let deallocating = target.rx_deallocating let deallocating = target.rx.deallocating
return deallocating return deallocating
.map { _ in .map { _ in
@ -87,7 +87,7 @@ extension ObservableType where E == AnyObject? {
} }
func observeWeaklyKeyPathFor( func observeWeaklyKeyPathFor(
target: NSObject, _ target: NSObject,
keyPathSections: [String], keyPathSections: [String],
options: NSKeyValueObservingOptions options: NSKeyValueObservingOptions
) -> Observable<AnyObject?> { ) -> Observable<AnyObject?> {
@ -99,13 +99,13 @@ func observeWeaklyKeyPathFor(
let property = class_getProperty(object_getClass(target), propertyName) let property = class_getProperty(object_getClass(target), propertyName)
if property == nil { if property == nil {
return Observable.error(RxCocoaError.InvalidPropertyName(object: target, propertyName: propertyName)) return Observable.error(RxCocoaError.invalidPropertyName(object: target, propertyName: propertyName))
} }
let propertyAttributes = property_getAttributes(property) let propertyAttributes = property_getAttributes(property)
// should dealloc hook be in place if week property, or just create strong reference because it doesn't matter // should dealloc hook be in place if week property, or just create strong reference because it doesn't matter
let isWeak = isWeakProperty(String.fromCString(propertyAttributes) ?? "") let isWeak = isWeakProperty(propertyAttributes.map(String.init) ?? "")
let propertyObservable = KVOObservable(object: target, keyPath: propertyName, options: options.union(.Initial), retainTarget: false) as KVOObservable<AnyObject> let propertyObservable = KVOObservable(object: target, keyPath: propertyName, options: options.union(.initial), retainTarget: false) as KVOObservable<AnyObject>
// KVO recursion for value changes // KVO recursion for value changes
return propertyObservable return propertyObservable
@ -118,7 +118,7 @@ func observeWeaklyKeyPathFor(
let strongTarget: AnyObject? = weakTarget let strongTarget: AnyObject? = weakTarget
if nextObject == nil { if nextObject == nil {
return Observable.error(RxCocoaError.InvalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName)) return Observable.error(RxCocoaError.invalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName))
} }
// if target is alive, then send change // if target is alive, then send change

View File

@ -20,7 +20,7 @@ protocol KVOObservableProtocol {
class KVOObserver : _RXKVOObserver class KVOObserver : _RXKVOObserver
, Disposable { , Disposable {
typealias Callback = (AnyObject?) -> Void typealias Callback = @escaping (Any?) -> Void
var retainSelf: KVOObserver? = nil var retainSelf: KVOObserver? = nil
@ -43,4 +43,4 @@ class KVOObserver : _RXKVOObserver
OSAtomicDecrement32(&resourceCount) OSAtomicDecrement32(&resourceCount)
#endif #endif
} }
} }

View File

@ -29,8 +29,8 @@ import Foundation
init() { init() {
} }
@objc func messageSentWithParameters(parameters: [AnyObject]) -> Void { @objc func messageSent(withParameters parameters: [Any]) -> Void {
_subject.on(.Next()) _subject.on(.next())
} }
func asObservable() -> Observable<()> { func asObservable() -> Observable<()> {
@ -38,7 +38,7 @@ import Foundation
} }
deinit { deinit {
_subject.on(.Completed) _subject.on(.completed)
} }
} }
@ -58,8 +58,8 @@ import Foundation
init() { init() {
} }
@objc func messageSentWithParameters(parameters: [AnyObject]) -> Void { @objc func messageSent(withParameters parameters: [Any]) -> Void {
_subject.on(.Next(parameters)) _subject.on(.next(parameters as [AnyObject]))
} }
func asObservable() -> Observable<[AnyObject]> { func asObservable() -> Observable<[AnyObject]> {
@ -67,7 +67,7 @@ import Foundation
} }
deinit { deinit {
_subject.on(.Completed) _subject.on(.completed)
} }
} }

View File

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

View File

@ -11,34 +11,34 @@ import Foundation
import RxSwift import RxSwift
#endif #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 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. 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") // @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?> { public func 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) return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
.map(E.init) .map(E.init)
} }
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
// KVO // 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") // @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?> { public func observeWeakly<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return rx_observeWeakly(E.KVOType.self, keyPath, options: options) return observeWeakly(E.KVOType.self, keyPath, options: options)
.map(E.init) .map(E.init)
} }
} }

View File

@ -11,40 +11,40 @@ import Foundation
import RxSwift import RxSwift
#endif #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. This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
It is useful for observing bridged ObjC enum values. 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") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observe<E: RawRepresentable where E.RawValue: KVORepresentable>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.New, .Initial], retainSelf: Bool = true) -> Observable<E?> { public func 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) return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
.map(E.init) .map(E.init)
} }
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
// rx_observeWeakly + RawRepresentable // observeWeakly + RawRepresentable
extension NSObject { 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. This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
It is useful for observing bridged ObjC enum values. 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") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_observeWeakly<E: RawRepresentable where E.RawValue: KVORepresentable>(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.New, .Initial]) -> Observable<E?> { public func 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) return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)
.map(E.init) .map(E.init)
} }
} }

View File

@ -38,39 +38,39 @@ Both approaches can fail in certain scenarios:
Second approach is chosen. It can fail in case there are multiple libraries dynamically trying 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. 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. 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 `self` or from ancestors in ownership graph (`retainSelf = false`)
* it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) * 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. * 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 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 keyPath: Key path of property names to observe.
- parameter options: KVO mechanism notification options. - parameter options: KVO mechanism notification options.
- parameter retainSelf: Retains self during observation if set `true`. - parameter retainSelf: Retains self during observation if set `true`.
- returns: Observable sequence of objects on `keyPath`. - returns: Observable sequence of objects on `keyPath`.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @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?> { public func 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() return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()
} }
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
// KVO // KVO
extension NSObject { extension Reactive where Base: NSObject {
/** /**
Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`. 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 * 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 * it can be used to observe `weak` properties
@ -81,9 +81,9 @@ extension NSObject {
- parameter options: KVO mechanism notification options. - parameter options: KVO mechanism notification options.
- returns: Observable sequence of objects on `keyPath`. - returns: Observable sequence of objects on `keyPath`.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @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?> { public func observeWeakly<E>(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {
return observeWeaklyKeyPathFor(self, keyPath: keyPath, options: options) return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options)
.map { n in .map { n in
return n as? E return n as? E
} }
@ -92,7 +92,7 @@ extension NSObject {
#endif #endif
// Dealloc // Dealloc
extension NSObject { extension Reactive where Base: AnyObject {
/** /**
Observable sequence of object deallocated events. Observable sequence of object deallocated events.
@ -101,15 +101,15 @@ extension NSObject {
- returns: Observable sequence of object deallocated events. - returns: Observable sequence of object deallocated events.
*/ */
public var rx_deallocated: Observable<Void> { public var deallocated: Observable<Void> {
return rx_synchronized { return synchronized {
if let deallocObservable = objc_getAssociatedObject(self, &deallocatedSubjectContext) as? DeallocObservable { if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable {
return deallocObservable._subject return deallocObservable._subject
} }
let deallocObservable = DeallocObservable() let deallocObservable = DeallocObservable()
objc_setAssociatedObject(self, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return deallocObservable._subject return deallocObservable._subject
} }
} }
@ -125,24 +125,24 @@ extension NSObject {
- returns: Observable sequence of object deallocating events. - returns: Observable sequence of object deallocating events.
*/ */
public func rx_sentMessage(selector: Selector) -> Observable<[AnyObject]> { public func sentMessage(_ selector: Selector) -> Observable<[AnyObject]> {
return rx_synchronized { return synchronized {
// in case of dealloc selector replay subject behavior needs to be used // in case of dealloc selector replay subject behavior needs to be used
if selector == deallocSelector { if selector == deallocSelector {
return rx_deallocating.map { _ in [] } return deallocating.map { _ in [] }
} }
let rxSelector = RX_selector(selector) let rxSelector = RX_selector(selector)
let selectorReference = RX_reference_from_selector(rxSelector) let selectorReference = RX_reference_from_selector(rxSelector)
let subject: MessageSentObservable let subject: MessageSentObservable
if let existingSubject = objc_getAssociatedObject(self, selectorReference) as? MessageSentObservable { if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? MessageSentObservable {
subject = existingSubject subject = existingSubject
} }
else { else {
subject = MessageSentObservable() subject = MessageSentObservable()
objc_setAssociatedObject( objc_setAssociatedObject(
self, base,
selectorReference, selectorReference,
subject, subject,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC .OBJC_ASSOCIATION_RETAIN_NONATOMIC
@ -150,17 +150,16 @@ extension NSObject {
} }
if subject.isActive { if subject.isActive {
return subject.asObservable() return subject.asObservable().map { $0 }
} }
var error: NSError? var error: NSError?
let targetImplementation = RX_ensure_observing(self, selector, &error) guard let targetImplementation = RX_ensure_observing(base, selector, &error) else {
if targetImplementation == nil { return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.Unknown)
} }
subject.targetImplementation = targetImplementation subject.targetImplementation = targetImplementation
return subject.asObservable() return subject.asObservable().map { $0 }
} }
} }
@ -174,17 +173,17 @@ extension NSObject {
- returns: Observable sequence of object deallocating events. - returns: Observable sequence of object deallocating events.
*/ */
public var rx_deallocating: Observable<()> { public var deallocating: Observable<()> {
return rx_synchronized { return synchronized {
let subject: DeallocatingObservable let subject: DeallocatingObservable
if let existingSubject = objc_getAssociatedObject(self, rxDeallocatingSelectorReference) as? DeallocatingObservable { if let existingSubject = objc_getAssociatedObject(base, rxDeallocatingSelectorReference) as? DeallocatingObservable {
subject = existingSubject subject = existingSubject
} }
else { else {
subject = DeallocatingObservable() subject = DeallocatingObservable()
objc_setAssociatedObject( objc_setAssociatedObject(
self, base,
rxDeallocatingSelectorReference, rxDeallocatingSelectorReference,
subject, subject,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC .OBJC_ASSOCIATION_RETAIN_NONATOMIC
@ -196,12 +195,12 @@ extension NSObject {
} }
var error: NSError? var error: NSError?
let targetImplementation = RX_ensure_observing(self, deallocSelector, &error) let targetImplementation = RX_ensure_observing(base, deallocSelector, &error)
if targetImplementation == nil { if targetImplementation == nil {
return Observable.error(error?.rxCocoaErrorForTarget(self) ?? RxCocoaError.Unknown) return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown)
} }
subject.targetImplementation = targetImplementation subject.targetImplementation = targetImplementation!
return subject.asObservable() return subject.asObservable()
} }
} }
@ -212,29 +211,29 @@ let deallocSelector = NSSelectorFromString("dealloc")
let rxDeallocatingSelector = RX_selector(deallocSelector) let rxDeallocatingSelector = RX_selector(deallocSelector)
let rxDeallocatingSelectorReference = RX_reference_from_selector(rxDeallocatingSelector) let rxDeallocatingSelectorReference = RX_reference_from_selector(rxDeallocatingSelector)
extension NSObject { extension Reactive where Base: AnyObject {
func rx_synchronized<T>(@noescape action: () -> T) -> T { func synchronized<T>( _ action: () -> T) -> T {
objc_sync_enter(self) objc_sync_enter(self.base)
let result = action() let result = action()
objc_sync_exit(self) objc_sync_exit(self.base)
return result return result
} }
} }
extension NSObject { extension Reactive where Base: AnyObject {
/** /**
Helper to make sure that `Observable` returned from `createCachedObservable` is only created once. 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`. This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`.
*/ */
func rx_lazyInstanceObservable<T: AnyObject>(key: UnsafePointer<Void>, createCachedObservable: () -> T) -> T { func lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {
if let value = objc_getAssociatedObject(self, key) { if let value = objc_getAssociatedObject(base, key) {
return value as! T return value as! T
} }
let observable = createCachedObservable() let observable = createCachedObservable()
objc_setAssociatedObject(self, key, observable, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return observable return observable
} }
} }

View File

@ -15,24 +15,24 @@ import RxSwift
RxCocoa URL errors. RxCocoa URL errors.
*/ */
public enum RxCocoaURLError public enum RxCocoaURLError
: ErrorType : Swift.Error
, CustomDebugStringConvertible { , CustomDebugStringConvertible {
/** /**
Unknown error occurred. Unknown error occurred.
*/ */
case Unknown case unknown
/** /**
Response is not NSHTTPURLResponse Response is not NSHTTPURLResponse
*/ */
case NonHTTPResponse(response: NSURLResponse) case nonHTTPResponse(response: URLResponse)
/** /**
Response is not successful. (not in `200 ..< 300` range) Response is not successful. (not in `200 ..< 300` range)
*/ */
case HTTPRequestFailed(response: NSHTTPURLResponse, data: NSData?) case httpRequestFailed(response: HTTPURLResponse, data: Data?)
/** /**
Deserialization error. Deserialization error.
*/ */
case DeserializationError(error: ErrorType) case deserializationError(error: Swift.Error)
} }
public extension RxCocoaURLError { public extension RxCocoaURLError {
@ -41,40 +41,40 @@ public extension RxCocoaURLError {
*/ */
public var debugDescription: String { public var debugDescription: String {
switch self { switch self {
case .Unknown: case .unknown:
return "Unknown error has occurred." return "Unknown error has occurred."
case let .NonHTTPResponse(response): case let .nonHTTPResponse(response):
return "Response is not NSHTTPURLResponse `\(response)`." return "Response is not NSHTTPURLResponse `\(response)`."
case let .HTTPRequestFailed(response, _): case let .httpRequestFailed(response, _):
return "HTTP request failed with `\(response.statusCode)`." return "HTTP request failed with `\(response.statusCode)`."
case let .DeserializationError(error): case let .deserializationError(error):
return "Error during deserialization of the response: \(error)" return "Error during deserialization of the response: \(error)"
} }
} }
} }
func escapeTerminalString(value: String) -> String { func escapeTerminalString(_ value: String) -> String {
return value.stringByReplacingOccurrencesOfString("\"", withString: "\\\"", options:[], range: nil) return value.replacingOccurrences(of: "\"", with: "\\\"", options:[], range: nil)
} }
func convertURLRequestToCurlCommand(request: NSURLRequest) -> String { func convertURLRequestToCurlCommand(_ request: URLRequest) -> String {
let method = request.HTTPMethod ?? "GET" let method = request.httpMethod ?? "GET"
var returnValue = "curl -X \(method) " var returnValue = "curl -X \(method) "
if request.HTTPMethod == "POST" && request.HTTPBody != nil { if request.httpMethod == "POST" && request.httpBody != nil {
let maybeBody = NSString(data: request.HTTPBody!, encoding: NSUTF8StringEncoding) as? String let maybeBody = NSString(data: request.httpBody!, encoding: String.Encoding.utf8.rawValue) as? String
if let body = maybeBody { if let body = maybeBody {
returnValue += "-d \"\(escapeTerminalString(body))\" " returnValue += "-d \"\(escapeTerminalString(body))\" "
} }
} }
for (key, value) in request.allHTTPHeaderFields ?? [:] { for (key, value) in request.allHTTPHeaderFields ?? [:] {
let escapedKey = escapeTerminalString((key as String) ?? "") let escapedKey = escapeTerminalString(key as String)
let escapedValue = escapeTerminalString((value as String) ?? "") let escapedValue = escapeTerminalString(value as String)
returnValue += "\n -H \"\(escapedKey): \(escapedValue)\" " returnValue += "\n -H \"\(escapedKey): \(escapedValue)\" "
} }
let URLString = request.URL?.absoluteString ?? "<unknown url>" let URLString = request.url?.absoluteString ?? "<unknown url>"
returnValue += "\n\"\(escapeTerminalString(URLString))\"" returnValue += "\n\"\(escapeTerminalString(URLString))\""
@ -83,10 +83,10 @@ func convertURLRequestToCurlCommand(request: NSURLRequest) -> String {
return returnValue return returnValue
} }
func convertResponseToString(data: NSData!, _ response: NSURLResponse!, _ error: NSError!, _ interval: NSTimeInterval) -> String { func convertResponseToString(_ data: Data!, _ response: URLResponse!, _ error: NSError!, _ interval: TimeInterval) -> String {
let ms = Int(interval * 1000) let ms = Int(interval * 1000)
if let response = response as? NSHTTPURLResponse { if let response = response as? HTTPURLResponse {
if 200 ..< 300 ~= response.statusCode { if 200 ..< 300 ~= response.statusCode {
return "Success (\(ms)ms): Status \(response.statusCode)" return "Success (\(ms)ms): Status \(response.statusCode)"
} }
@ -105,7 +105,7 @@ func convertResponseToString(data: NSData!, _ response: NSURLResponse!, _ error:
return "<Unhandled response from server>" return "<Unhandled response from server>"
} }
extension NSURLSession { extension Reactive where Base: URLSession {
/** /**
Observable sequence of responses for URL request. Observable sequence of responses for URL request.
@ -118,44 +118,44 @@ extension NSURLSession {
- parameter request: URL request. - parameter request: URL request.
- returns: Observable sequence of URL responses. - returns: Observable sequence of URL responses.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSHTTPURLResponse)> { public func response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> {
return Observable.create { observer in return Observable.create { observer in
// smart compiler should be able to optimize this out // smart compiler should be able to optimize this out
var d: NSDate? var d: Date?
if Logging.URLRequests(request) { if Logging.URLRequests(request) {
d = NSDate() d = Date()
} }
let task = self.dataTaskWithRequest(request) { (data, response, error) in let task = self.base.dataTask(with: request) { (data, response, error) in
if Logging.URLRequests(request) { if Logging.URLRequests(request) {
let interval = NSDate().timeIntervalSinceDate(d ?? NSDate()) let interval = Date().timeIntervalSince(d ?? Date())
print(convertURLRequestToCurlCommand(request)) print(convertURLRequestToCurlCommand(request))
print(convertResponseToString(data, response, error, interval)) print(convertResponseToString(data, response, error as NSError!, interval))
} }
guard let response = response, data = data else { guard let response = response, let data = data else {
observer.on(.Error(error ?? RxCocoaURLError.Unknown)) observer.on(.error(error ?? RxCocoaURLError.unknown))
return return
} }
guard let httpResponse = response as? NSHTTPURLResponse else { guard let httpResponse = response as? HTTPURLResponse else {
observer.on(.Error(RxCocoaURLError.NonHTTPResponse(response: response))) observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))
return return
} }
observer.on(.Next(data, httpResponse)) observer.on(.next(data, httpResponse))
observer.on(.Completed) observer.on(.completed)
} }
let t = task let t = task
t.resume() t.resume()
return AnonymousDisposable(task.cancel) return Disposables.create(with: task.cancel)
} }
} }
@ -174,14 +174,14 @@ extension NSURLSession {
- parameter request: URL request. - parameter request: URL request.
- returns: Observable sequence of response data. - returns: Observable sequence of response data.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_data(request: NSURLRequest) -> Observable<NSData> { public func data(_ request: URLRequest) -> Observable<Data> {
return rx_response(request).map { (data, response) -> NSData in return response(request).map { (data, response) -> Data in
if 200 ..< 300 ~= response.statusCode { if 200 ..< 300 ~= response.statusCode {
return data return data
} }
else { else {
throw RxCocoaURLError.HTTPRequestFailed(response: response, data: data) throw RxCocoaURLError.httpRequestFailed(response: response, data: data)
} }
} }
} }
@ -203,13 +203,13 @@ extension NSURLSession {
- parameter request: URL request. - parameter request: URL request.
- returns: Observable sequence of response JSON. - returns: Observable sequence of response JSON.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_JSON(request: NSURLRequest) -> Observable<AnyObject> { public func JSON(_ request: URLRequest) -> Observable<AnyObject> {
return rx_data(request).map { (data) -> AnyObject in return data(request).map { (data) -> AnyObject in
do { do {
return try NSJSONSerialization.JSONObjectWithData(data, options: []) return try JSONSerialization.jsonObject(with: data, options: []) as AnyObject
} catch let error { } catch let error {
throw RxCocoaURLError.DeserializationError(error: error) throw RxCocoaURLError.deserializationError(error: error)
} }
} }
} }
@ -231,8 +231,8 @@ extension NSURLSession {
- parameter URL: URL of `NSURLRequest` request. - parameter URL: URL of `NSURLRequest` request.
- returns: Observable sequence of response JSON. - returns: Observable sequence of response JSON.
*/ */
@warn_unused_result(message="http://git.io/rxs.uo") // @warn_unused_result(message:"http://git.io/rxs.uo")
public func rx_JSON(URL: NSURL) -> Observable<AnyObject> { public func JSON(_ URL: Foundation.URL) -> Observable<AnyObject> {
return rx_JSON(NSURLRequest(URL: URL)) return JSON(URLRequest(url: URL))
} }
} }

View File

@ -15,12 +15,12 @@ class RxCLLocationManagerDelegateProxy : DelegateProxy
, CLLocationManagerDelegate , CLLocationManagerDelegate
, DelegateProxyType { , DelegateProxyType {
class func currentDelegateFor(object: AnyObject) -> AnyObject? { class func currentDelegateFor(_ object: AnyObject) -> AnyObject? {
let locationManager: CLLocationManager = castOrFatalError(object) let locationManager: CLLocationManager = castOrFatalError(object)
return locationManager.delegate return locationManager.delegate
} }
class func setCurrentDelegate(delegate: AnyObject?, toObject object: AnyObject) { class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) {
let locationManager: CLLocationManager = castOrFatalError(object) let locationManager: CLLocationManager = castOrFatalError(object)
locationManager.delegate = castOptionalOrFatalError(delegate) locationManager.delegate = castOptionalOrFatalError(delegate)
} }

View File

@ -7,27 +7,52 @@
// //
/** /**
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 With this approach we can have more specialized methods and properties using
extension SomeType: Reactive {} `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 { public struct Reactive<Base> {
// 3. Put any specific reactive extension for SomeType here /**
Base object to extend.
*/
public let base: Base
/**
Creates extensions with base object.
- parameter base: Base object.
*/
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 {
} }
/**
A type that has reactive extensions.
*/
public protocol ReactiveCompatible {
associatedtype CompatibleType
var rx: Reactive<CompatibleType> { get }
}
public extension ReactiveCompatible {
public var rx: Reactive<Self> {
return Reactive(self)
}
}
/**
Extend NSObject with `rx` proxy.
*/
extension NSObject: ReactiveCompatible { }

View File

@ -18,36 +18,36 @@ import RxSwift
RxCocoa errors. RxCocoa errors.
*/ */
public enum RxCocoaError public enum RxCocoaError
: ErrorType : Swift.Error
, CustomDebugStringConvertible { , CustomDebugStringConvertible {
/** /**
Unknown error has occurred. Unknown error has occurred.
*/ */
case Unknown case unknown
/** /**
Invalid operation was attempted. Invalid operation was attempted.
*/ */
case InvalidOperation(object: AnyObject) case invalidOperation(object: AnyObject)
/** /**
Items are not yet bound to user interface but have been requested. Items are not yet bound to user interface but have been requested.
*/ */
case ItemsNotYetBound(object: AnyObject) case itemsNotYetBound(object: AnyObject)
/** /**
Invalid KVO Path. Invalid KVO Path.
*/ */
case InvalidPropertyName(object: AnyObject, propertyName: String) case invalidPropertyName(object: AnyObject, propertyName: String)
/** /**
Invalid object on key path. Invalid object on key path.
*/ */
case InvalidObjectOnKeyPath(object: AnyObject, sourceObject: AnyObject, propertyName: String) case invalidObjectOnKeyPath(object: AnyObject, sourceObject: AnyObject, propertyName: String)
/** /**
Error during swizzling. Error during swizzling.
*/ */
case ErrorDuringSwizzling case errorDuringSwizzling
/* /*
Casting error. Casting error.
*/ */
case CastingError(object: AnyObject, targetType: Any.Type) case castingError(object: AnyObject, targetType: Any.Type)
} }
#if !DISABLE_SWIZZLING #if !DISABLE_SWIZZLING
@ -58,31 +58,31 @@ public enum RxCocoaInterceptionMechanism {
/** /**
Unknown message interception mechanism. Unknown message interception mechanism.
*/ */
case Unknown case unknown
/** /**
Key value observing interception mechanism. Key value observing interception mechanism.
*/ */
case KVO case kvo
} }
/** /**
RxCocoa ObjC runtime modification errors. RxCocoa ObjC runtime modification errors.
*/ */
public enum RxCocoaObjCRuntimeError public enum RxCocoaObjCRuntimeError
: ErrorType : Swift.Error
, CustomDebugStringConvertible { , CustomDebugStringConvertible {
/** /**
Unknown error has occurred. Unknown error has occurred.
*/ */
case Unknown(target: AnyObject) case unknown(target: AnyObject)
/** /**
If the object is reporting a different class then it's real class, that means that there is probably 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. 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 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 class and restore original class. Unfortunately that will happen no matter was there another interceptor
@ -90,7 +90,7 @@ public enum RxCocoaObjCRuntimeError
Failure scenario: Failure scenario:
* KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`) * 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) * 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 The reason why changing order of observing works is because any interception method on unregistration
@ -101,12 +101,12 @@ public enum RxCocoaObjCRuntimeError
it's highly unlikely it would have any benefit in real world use cases, and it's even more it's highly unlikely it would have any benefit in real world use cases, and it's even more
dangerous. dangerous.
*/ */
case ObjectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism) case objectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism)
/** /**
Trying to observe messages for selector that isn't implemented. Trying to observe messages for selector that isn't implemented.
*/ */
case SelectorNotImplemented(target: AnyObject) case selectorNotImplemented(target: AnyObject)
/** /**
Core Foundation classes are usually toll free bridged. Those classes crash the program in case Core Foundation classes are usually toll free bridged. Those classes crash the program in case
@ -115,7 +115,7 @@ public enum RxCocoaObjCRuntimeError
There is a possibility to just swizzle methods on original object, but since those won't be usual use There is a possibility to just swizzle methods on original object, but since those won't be usual use
cases for this library, then an error will just be reported for now. cases for this library, then an error will just be reported for now.
*/ */
case CantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject) case cantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject)
/** /**
Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only
@ -124,17 +124,17 @@ public enum RxCocoaObjCRuntimeError
To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and
it's meta-class. it's meta-class.
*/ */
case ThreadingCollisionWithOtherInterceptionMechanism(target: AnyObject) case threadingCollisionWithOtherInterceptionMechanism(target: AnyObject)
/** /**
For some reason saving original method implementation under RX namespace failed. For some reason saving original method implementation under RX namespace failed.
*/ */
case SavingOriginalForwardingMethodFailed(target: AnyObject) case savingOriginalForwardingMethodFailed(target: AnyObject)
/** /**
Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason. Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.
*/ */
case ReplacingMethodWithForwardingImplementation(target: AnyObject) case replacingMethodWithForwardingImplementation(target: AnyObject)
/** /**
Attempt to intercept one of the performance sensitive methods: Attempt to intercept one of the performance sensitive methods:
@ -143,7 +143,7 @@ public enum RxCocoaObjCRuntimeError
* methodSignatureForSelector: * methodSignatureForSelector:
* forwardingTargetForSelector: * forwardingTargetForSelector:
*/ */
case ObservingPerformanceSensitiveMessages(target: AnyObject) case observingPerformanceSensitiveMessages(target: AnyObject)
/** /**
Message implementation has unsupported return type (for example large struct). The reason why this is a error Message implementation has unsupported return type (for example large struct). The reason why this is a error
@ -152,7 +152,7 @@ public enum RxCocoaObjCRuntimeError
The unsupported cases should be fairly uncommon. The unsupported cases should be fairly uncommon.
*/ */
case ObservingMessagesWithUnsupportedReturnType(target: AnyObject) case observingMessagesWithUnsupportedReturnType(target: AnyObject)
} }
#endif #endif
@ -165,19 +165,19 @@ public extension RxCocoaError {
*/ */
public var debugDescription: String { public var debugDescription: String {
switch self { switch self {
case .Unknown: case .unknown:
return "Unknown error occurred." return "Unknown error occurred."
case let .InvalidOperation(object): case let .invalidOperation(object):
return "Invalid operation was attempted on `\(object)`." return "Invalid operation was attempted on `\(object)`."
case let .ItemsNotYetBound(object): case let .itemsNotYetBound(object):
return "Data source is set, but items are not yet bound to user interface for `\(object)`." return "Data source is set, but items are not yet bound to user interface for `\(object)`."
case let .InvalidPropertyName(object, propertyName): case let .invalidPropertyName(object, propertyName):
return "Object `\(object)` dosn't have a property named `\(propertyName)`." return "Object `\(object)` dosn't have a property named `\(propertyName)`."
case let .InvalidObjectOnKeyPath(object, sourceObject, propertyName): case let .invalidObjectOnKeyPath(object, sourceObject, propertyName):
return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`." return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`."
case .ErrorDuringSwizzling: case .errorDuringSwizzling:
return "Error during swizzling." return "Error during swizzling."
case .CastingError(let object, let targetType): case .castingError(let object, let targetType):
return "Error casting `\(object)` to `\(targetType)`" return "Error casting `\(object)` to `\(targetType)`"
} }
} }
@ -191,25 +191,25 @@ public extension RxCocoaObjCRuntimeError {
*/ */
public var debugDescription: String { public var debugDescription: String {
switch self { switch self {
case let .Unknown(target): case let .unknown(target):
return "Unknown error occurred.\nTarget: `\(target)`" return "Unknown error occurred.\nTarget: `\(target)`"
case let ObjectMessagesAlreadyBeingIntercepted(target, interceptionMechanism): case let .objectMessagesAlreadyBeingIntercepted(target, interceptionMechanism):
let interceptionMechanismDescription = interceptionMechanism == .KVO ? "KVO" : "other interception mechanism" let interceptionMechanismDescription = interceptionMechanism == .kvo ? "KVO" : "other interception mechanism"
return "Collision between RxCocoa interception mechanism and \(interceptionMechanismDescription)." return "Collision between RxCocoa interception mechanism and \(interceptionMechanismDescription)."
+ " To resolve this conflict please use this interception mechanism first.\nTarget: \(target)" + " To resolve this conflict please use this interception mechanism first.\nTarget: \(target)"
case let SelectorNotImplemented(target): case let .selectorNotImplemented(target):
return "Trying to observe messages for selector that isn't implemented.\nTarget: \(target)" return "Trying to observe messages for selector that isn't implemented.\nTarget: \(target)"
case let CantInterceptCoreFoundationTollFreeBridgedObjects(target): case let .cantInterceptCoreFoundationTollFreeBridgedObjects(target):
return "Interception of messages sent to Core Foundation isn't supported.\nTarget: \(target)" return "Interception of messages sent to Core Foundation isn't supported.\nTarget: \(target)"
case let ThreadingCollisionWithOtherInterceptionMechanism(target): case let .threadingCollisionWithOtherInterceptionMechanism(target):
return "Detected a conflict while modifying ObjC runtime.\nTarget: \(target)" return "Detected a conflict while modifying ObjC runtime.\nTarget: \(target)"
case let SavingOriginalForwardingMethodFailed(target): case let .savingOriginalForwardingMethodFailed(target):
return "Saving original method implementation failed.\nTarget: \(target)" return "Saving original method implementation failed.\nTarget: \(target)"
case let ReplacingMethodWithForwardingImplementation(target): case let .replacingMethodWithForwardingImplementation(target):
return "Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\nTarget: \(target)" return "Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\nTarget: \(target)"
case let ObservingPerformanceSensitiveMessages(target): case let .observingPerformanceSensitiveMessages(target):
return "Attempt to intercept one of the performance sensitive methods. \nTarget: \(target)" return "Attempt to intercept one of the performance sensitive methods. \nTarget: \(target)"
case let ObservingMessagesWithUnsupportedReturnType(target): case let .observingMessagesWithUnsupportedReturnType(target):
return "Attempt to intercept a method with unsupported return type. \nTarget: \(target)" return "Attempt to intercept a method with unsupported return type. \nTarget: \(target)"
} }
} }
@ -219,7 +219,7 @@ public extension RxCocoaObjCRuntimeError {
// MARK: Error binding policies // MARK: Error binding policies
func bindingErrorToInterface(error: ErrorType) { func bindingErrorToInterface(_ error: Swift.Error) {
let error = "Binding error to UI: \(error)" let error = "Binding error to UI: \(error)"
#if DEBUG #if DEBUG
rxFatalError(error) rxFatalError(error)
@ -230,18 +230,18 @@ func bindingErrorToInterface(error: ErrorType) {
// MARK: Abstract methods // MARK: Abstract methods
@noreturn func rxAbstractMethodWithMessage(message: String) { func rxAbstractMethodWithMessage(_ message: String) -> Swift.Never {
rxFatalError(message) rxFatalError(message)
} }
@noreturn func rxAbstractMethod() { func rxAbstractMethod() -> Swift.Never {
rxFatalError("Abstract method") rxFatalError("Abstract method")
} }
// MARK: casts or fatal error // MARK: casts or fatal error
// workaround for Swift compiler bug, cheers compiler team :) // workaround for Swift compiler bug, cheers compiler team :)
func castOptionalOrFatalError<T>(value: AnyObject?) -> T? { func castOptionalOrFatalError<T>(_ value: AnyObject?) -> T? {
if value == nil { if value == nil {
return nil return nil
} }
@ -249,27 +249,27 @@ func castOptionalOrFatalError<T>(value: AnyObject?) -> T? {
return v return v
} }
func castOrThrow<T>(resultType: T.Type, _ object: AnyObject) throws -> T { func castOrThrow<T>(_ resultType: T.Type, _ object: AnyObject) throws -> T {
guard let returnValue = object as? T else { guard let returnValue = object as? T else {
throw RxCocoaError.CastingError(object: object, targetType: resultType) throw RxCocoaError.castingError(object: object, targetType: resultType)
} }
return returnValue return returnValue
} }
func castOptionalOrThrow<T>(resultType: T.Type, _ object: AnyObject) throws -> T? { func castOptionalOrThrow<T>(_ resultType: T.Type, _ object: AnyObject) throws -> T? {
if NSNull().isEqual(object) { if NSNull().isEqual(object) {
return nil return nil
} }
guard let returnValue = object as? T else { guard let returnValue = object as? T else {
throw RxCocoaError.CastingError(object: object, targetType: resultType) throw RxCocoaError.castingError(object: object, targetType: resultType)
} }
return returnValue return returnValue
} }
func castOrFatalError<T>(value: AnyObject!, message: String) -> T { func castOrFatalError<T>(_ value: AnyObject!, message: String) -> T {
let maybeResult: T? = value as? T let maybeResult: T? = value as? T
guard let result = maybeResult else { guard let result = maybeResult else {
rxFatalError(message) rxFatalError(message)
@ -278,7 +278,7 @@ func castOrFatalError<T>(value: AnyObject!, message: String) -> T {
return result return result
} }
func castOrFatalError<T>(value: Any!) -> T { func castOrFatalError<T>(_ value: Any!) -> T {
let maybeResult: T? = value as? T let maybeResult: T? = value as? T
guard let result = maybeResult else { guard let result = maybeResult else {
rxFatalError("Failure converting from \(value) to \(T.self)") rxFatalError("Failure converting from \(value) to \(T.self)")
@ -296,35 +296,37 @@ let delegateNotSet = "Delegate not set"
// MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError` // MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError`
extension NSError { extension Error {
func rxCocoaErrorForTarget(target: AnyObject) -> RxCocoaObjCRuntimeError { func rxCocoaErrorForTarget(_ target: AnyObject) -> RxCocoaObjCRuntimeError {
if domain == RXObjCRuntimeErrorDomain { let error = self as NSError
let errorCode = RXObjCRuntimeError(rawValue: self.code) ?? .Unknown
if error.domain == RXObjCRuntimeErrorDomain {
let errorCode = RXObjCRuntimeError(rawValue: error.code) ?? .unknown
switch errorCode { switch errorCode {
case .Unknown: case .unknown:
return .Unknown(target: target) return .unknown(target: target)
case .ObjectMessagesAlreadyBeingIntercepted: case .objectMessagesAlreadyBeingIntercepted:
let isKVO = (self.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false let isKVO = (error.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false
return .ObjectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .KVO : .Unknown) return .objectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .kvo : .unknown)
case .SelectorNotImplemented: case .selectorNotImplemented:
return .SelectorNotImplemented(target: target) return .selectorNotImplemented(target: target)
case .CantInterceptCoreFoundationTollFreeBridgedObjects: case .cantInterceptCoreFoundationTollFreeBridgedObjects:
return .CantInterceptCoreFoundationTollFreeBridgedObjects(target: target) return .cantInterceptCoreFoundationTollFreeBridgedObjects(target: target)
case .ThreadingCollisionWithOtherInterceptionMechanism: case .threadingCollisionWithOtherInterceptionMechanism:
return .ThreadingCollisionWithOtherInterceptionMechanism(target: target) return .threadingCollisionWithOtherInterceptionMechanism(target: target)
case .SavingOriginalForwardingMethodFailed: case .savingOriginalForwardingMethodFailed:
return .SavingOriginalForwardingMethodFailed(target: target) return .savingOriginalForwardingMethodFailed(target: target)
case .ReplacingMethodWithForwardingImplementation: case .replacingMethodWithForwardingImplementation:
return .ReplacingMethodWithForwardingImplementation(target: target) return .replacingMethodWithForwardingImplementation(target: target)
case .ObservingPerformanceSensitiveMessages: case .observingPerformanceSensitiveMessages:
return .ObservingPerformanceSensitiveMessages(target: target) return .observingPerformanceSensitiveMessages(target: target)
case .ObservingMessagesWithUnsupportedReturnType: case .observingMessagesWithUnsupportedReturnType:
return .ObservingMessagesWithUnsupportedReturnType(target: target) return .observingMessagesWithUnsupportedReturnType(target: target)
} }
} }
return RxCocoaObjCRuntimeError.Unknown(target: target) return RxCocoaObjCRuntimeError.unknown(target: target)
} }
} }
@ -335,7 +337,7 @@ extension NSError {
#if !RX_NO_MODULE #if !RX_NO_MODULE
@noreturn func rxFatalError(lastMessage: String) { func rxFatalError(_ lastMessage: String) -> Never {
// The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours. // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.
fatalError(lastMessage) fatalError(lastMessage)
} }

View File

@ -41,4 +41,4 @@ class RxTarget : NSObject
OSAtomicDecrement32(&resourceCount) OSAtomicDecrement32(&resourceCount)
} }
#endif #endif
} }

View File

@ -1,39 +0,0 @@
//
// RxTextInput.swift
// Rx
//
// Created by Krunoslav Zaher on 5/12/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
#if os(iOS) || os(tvOS)
import UIKit
/**
Represents text input with reactive extensions.
*/
public protocol RxTextInput : UITextInput {
/**
Reactive wrapper for `text` property.
*/
var rx_text: ControlProperty<String> { get }
}
#endif
#if os(OSX)
import Cocoa
/**
Represents text input with reactive extensions.
*/
public protocol RxTextInput : NSTextInput {
/**
Reactive wrapper for `text` property.
*/
var rx_text: ControlProperty<String> { get }
}
#endif

View File

@ -20,5 +20,20 @@ public protocol SectionedViewDataSourceType {
- parameter indexPath: Model index path - parameter indexPath: Model index path
- returns: Model at index path. - returns: Model at index path.
*/ */
func modelAtIndexPath(indexPath: NSIndexPath) throws -> Any func model(_ indexPath: IndexPath) throws -> Any
} }
extension SectionedViewDataSourceType {
/**
Returns model at index path.
In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown.
- parameter indexPath: Model index path
- returns: Model at index path.
*/
@available(*, deprecated, renamed: "model(_:)")
func model(_ indexPath: IndexPath) throws -> Any {
return try self.model(indexPath)
}
}

View File

@ -0,0 +1,147 @@
//
// TextInput.swift
// Rx
//
// Created by Krunoslav Zaher on 5/12/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
#if os(iOS) || os(tvOS)
import UIKit
/**
Represents text input with reactive extensions.
*/
public struct TextInput<Base: UITextInput> {
/**
Base text input to extend.
*/
public let base: Base
/**
Reactive wrapper for `text` property.
*/
public let text: ControlProperty<String>
/**
Initializes new text input.
- parameter base: Base object.
- parameter text: Textual control property.
*/
public init(base: Base, text: ControlProperty<String>) {
self.base = base
self.text = text
}
}
extension Reactive where Base: UITextField {
/**
Reactive text input.
*/
public var textInput: TextInput<UITextField> {
return TextInput(base: base, text: self.text)
}
}
extension Reactive where Base: UITextView {
/**
Reactive text input.
*/
public var textInput: TextInput<UITextView> {
return TextInput(base: base, text: self.text)
}
}
/**
Represents text input with reactive extensions.
*/
@available(*, deprecated, renamed: "TextInput")
public protocol RxTextInput : UITextInput {
@available(*, deprecated, renamed: "rx.textInput.text")
var rx_text: ControlProperty<String> { get }
}
extension UITextField : RxTextInput {
@available(*, deprecated, renamed: "rx.textInput.text")
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
extension UITextView : RxTextInput {
@available(*, deprecated, renamed: "rx.textInput.text")
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
#endif
#if os(OSX)
import Cocoa
/**
Represents text input with reactive extensions.
*/
public struct TextInput<Base: NSTextInput> {
/**
Base text input to extend.
*/
public let base: Base
/**
Reactive wrapper for `text` property.
*/
public let text: ControlProperty<String>
/**
Initializes new text input.
- parameter base: Base object.
- parameter text: Textual control property.
*/
public init(base: Base, text: ControlProperty<String>) {
self.base = base
self.text = text
}
}
extension Reactive where Base: NSTextField {
/**
Reactive text input.
*/
public var textInput: TextInput<NSTextField> {
return TextInput(base: base, text: self.text)
}
}
/**
Represents text input with reactive extensions.
*/
@available(*, deprecated, renamed: "TextInput")
public protocol RxTextInput : NSTextInput {
/**
Reactive wrapper for `text` property.
*/
@available(*, deprecated, renamed: "rx.textInput.text")
var rx_text: ControlProperty<String> { get }
}
extension NSTextField : RxTextInput {
/**
Reactive wrapper for `text` property.
*/
@available(*, deprecated, renamed: "rx.textInput.text")
public var rx_text: ControlProperty<String> {
return self.rx.text
}
}
#endif

View File

@ -32,6 +32,12 @@
#define CLASS_VALUE(x) [NSValue valueWithNonretainedObject:(x)] #define CLASS_VALUE(x) [NSValue valueWithNonretainedObject:(x)]
#define IMP_VALUE(x) [NSValue valueWithPointer:(x)] #define IMP_VALUE(x) [NSValue valueWithPointer:(x)]
/**
Checks that the local `error` instance exists before assigning it's value by reference.
This macro exists to work around static analysis warnings `NSError` is always assumed to be `nullable`, even though we explictly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details.
*/
#define RX_SAFE_ERROR(errorValue) if (error != nil) { *error = (errorValue); }
// Inspired by http://p99.gforge.inria.fr // Inspired by http://p99.gforge.inria.fr
// https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC26 // https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC26

View File

@ -8,14 +8,18 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface _RXDelegateProxy : NSObject @interface _RXDelegateProxy : NSObject
@property (nonatomic, assign, readonly) id _forwardToDelegate; @property (nonatomic, weak, readonly) id _forwardToDelegate;
-(void)_setForwardToDelegate:(id)forwardToDelegate retainDelegate:(BOOL)retainDelegate; -(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate;
-(BOOL)hasWiredImplementationForSelector:(SEL)selector; -(BOOL)hasWiredImplementationForSelector:(SEL)selector;
-(void)interceptedSelector:(SEL)selector withArguments:(NSArray*)arguments; -(void)interceptedSelector:(SEL)selector withArguments:(NSArray*)arguments;
@end @end
NS_ASSUME_NONNULL_END

View File

@ -10,7 +10,9 @@
#import "_RX.h" #import "_RX.h"
#import "_RXObjCRuntime.h" #import "_RXObjCRuntime.h"
@interface _RXDelegateProxy () @interface _RXDelegateProxy () {
id __weak __forwardToDelegate;
}
@property (nonatomic, strong) id strongForwardDelegate; @property (nonatomic, strong) id strongForwardDelegate;
@ -58,7 +60,7 @@ static NSMutableDictionary *forwardableSelectorsPerClass = nil;
#define CLASS_HIERARCHY_MAX_DEPTH 100 #define CLASS_HIERARCHY_MAX_DEPTH 100
NSInteger classHierarchyDepth = 0; NSInteger classHierarchyDepth = 0;
Class targetClass = self; Class targetClass = NULL;
for (classHierarchyDepth = 0, targetClass = self; for (classHierarchyDepth = 0, targetClass = self;
classHierarchyDepth < CLASS_HIERARCHY_MAX_DEPTH && targetClass != nil; classHierarchyDepth < CLASS_HIERARCHY_MAX_DEPTH && targetClass != nil;
@ -90,7 +92,11 @@ static NSMutableDictionary *forwardableSelectorsPerClass = nil;
} }
-(void)_setForwardToDelegate:(id)forwardToDelegate retainDelegate:(BOOL)retainDelegate { -(id)_forwardToDelegate {
return __forwardToDelegate;
}
-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate {
__forwardToDelegate = forwardToDelegate; __forwardToDelegate = forwardToDelegate;
if (retainDelegate) { if (retainDelegate) {
self.strongForwardDelegate = forwardToDelegate; self.strongForwardDelegate = forwardToDelegate;

View File

@ -14,8 +14,6 @@
################################################################################ ################################################################################
*/ */
typedef void (^KVOCallback)(id);
// Exists because if written in Swift, reading unowned is disabled during dealloc process // Exists because if written in Swift, reading unowned is disabled during dealloc process
@interface _RXKVOObserver : NSObject @interface _RXKVOObserver : NSObject
@ -23,7 +21,7 @@ typedef void (^KVOCallback)(id);
retainTarget:(BOOL)retainTarget retainTarget:(BOOL)retainTarget
keyPath:(NSString*)keyPath keyPath:(NSString*)keyPath
options:(NSKeyValueObservingOptions)options options:(NSKeyValueObservingOptions)options
callback:(KVOCallback)callback; callback:(void (^)(id))callback;
-(void)dispose; -(void)dispose;

View File

@ -13,7 +13,7 @@
@property (nonatomic, unsafe_unretained) id target; @property (nonatomic, unsafe_unretained) id target;
@property (nonatomic, strong ) id retainedTarget; @property (nonatomic, strong ) id retainedTarget;
@property (nonatomic, copy ) NSString *keyPath; @property (nonatomic, copy ) NSString *keyPath;
@property (nonatomic, copy ) KVOCallback callback; @property (nonatomic, copy ) void (^callback)(id);
@end @end

View File

@ -596,9 +596,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSError** __nonnull)error { -(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSError** __nonnull)error {
Method instanceMethod = class_getInstanceMethod([target class], selector); Method instanceMethod = class_getInstanceMethod([target class], selector);
if (instanceMethod == nil) { if (instanceMethod == nil) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorSelectorNotImplemented code:RXObjCRuntimeErrorSelectorNotImplemented
userInfo:nil]; userInfo:nil]);
return nil; return nil;
} }
@ -606,18 +606,18 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
|| selector == @selector(forwardingTargetForSelector:) || selector == @selector(forwardingTargetForSelector:)
|| selector == @selector(methodSignatureForSelector:) || selector == @selector(methodSignatureForSelector:)
|| selector == @selector(respondsToSelector:)) { || selector == @selector(respondsToSelector:)) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages
userInfo:nil]; userInfo:nil]);
return nil; return nil;
} }
// For `dealloc` message, original implementation will be swizzled. // 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. // 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) { if (selector == deallocSelector) {
Class __nonnull deallocSwizzingTarget = [target class]; Class __nonnull deallocSwizzingTarget = [target class];
IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget]; IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];
@ -644,9 +644,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
RXInterceptWithOptimizedObserver optimizedIntercept = optimizedObserversByMethodEncoding[methodEncoding]; RXInterceptWithOptimizedObserver optimizedIntercept = optimizedObserversByMethodEncoding[methodEncoding];
if (!RX_method_has_supported_return_type(instanceMethod)) { if (!RX_method_has_supported_return_type(instanceMethod)) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType
userInfo:nil]; userInfo:nil]);
return nil; return nil;
} }
@ -686,10 +686,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
} }
} }
RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain code:RXObjCRuntimeErrorUnknown
code:RXObjCRuntimeErrorUnknown userInfo:nil]);
userInfo:nil];
return nil; return nil;
} }
@ -711,9 +710,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
BOOL isThisTollFreeFoundationClass = CFGetTypeID((CFTypeRef)target) != defaultTypeID; BOOL isThisTollFreeFoundationClass = CFGetTypeID((CFTypeRef)target) != defaultTypeID;
if (isThisTollFreeFoundationClass) { if (isThisTollFreeFoundationClass) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects
userInfo:nil]; userInfo:nil]);
return nil; return nil;
} }
@ -721,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 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. 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 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 class and restore original class. Unfortunately that will happen no matter was there another interceptor
@ -731,7 +730,7 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
Failure scenario: Failure scenario:
* KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`) * 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 * 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 The reason why changing order of observing works is because any interception method should return
@ -745,11 +744,11 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
if ([target class] != object_getClass(target)) { if ([target class] != object_getClass(target)) {
BOOL isKVO = [target respondsToSelector:NSSelectorFromString(@"_isKVOA")]; BOOL isKVO = [target respondsToSelector:NSSelectorFromString(@"_isKVOA")];
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted
userInfo:@{ userInfo:@{
RXObjCRuntimeErrorIsKVOKey: @(isKVO) RXObjCRuntimeErrorIsKVOKey : @(isKVO)
}]; }]);
return nil; return nil;
} }
@ -761,9 +760,9 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
Class previousClass = object_setClass(target, dynamicFakeSubclass); Class previousClass = object_setClass(target, dynamicFakeSubclass);
if (previousClass != wannaBeClass) { if (previousClass != wannaBeClass) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism
userInfo:nil]; userInfo:nil]);
THREADING_HAZARD(wannaBeClass); THREADING_HAZARD(wannaBeClass);
return nil; return nil;
} }
@ -816,25 +815,25 @@ static NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimi
IMP implementation = method_getImplementation(instanceMethod); IMP implementation = method_getImplementation(instanceMethod);
if (implementation == nil) { if (implementation == nil) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorSelectorNotImplemented code:RXObjCRuntimeErrorSelectorNotImplemented
userInfo:nil]; userInfo:nil]);
return NO; return NO;
} }
if (!class_addMethod(swizzlingImplementorClass, rxSelector, implementation, methodEncoding)) { if (!class_addMethod(swizzlingImplementorClass, rxSelector, implementation, methodEncoding)) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed
userInfo:nil]; userInfo:nil]);
return NO; return NO;
} }
if (!class_addMethod(swizzlingImplementorClass, selector, _objc_msgForward, methodEncoding)) { if (!class_addMethod(swizzlingImplementorClass, selector, _objc_msgForward, methodEncoding)) {
if (implementation != method_setImplementation(instanceMethod, _objc_msgForward)) { if (implementation != method_setImplementation(instanceMethod, _objc_msgForward)) {
*error = [NSError errorWithDomain:RXObjCRuntimeErrorDomain RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain
code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation
userInfo:nil]; userInfo:nil]);
THREADING_HAZARD(swizzlingImplementorClass); THREADING_HAZARD(swizzlingImplementorClass);
return NO; return NO;
} }
@ -1018,4 +1017,4 @@ NSInteger RX_number_of_swizzled_methods() {
#endif #endif
#endif #endif

Binary file not shown.

View File

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

View File

@ -15,29 +15,29 @@ import RxSwift
var rx_value_key: UInt8 = 0 var rx_value_key: UInt8 = 0
var rx_control_events_key: UInt8 = 0 var rx_control_events_key: UInt8 = 0
extension NSControl { extension Reactive where Base: NSControl {
/** /**
Reactive wrapper for control event. Reactive wrapper for control event.
*/ */
public var rx_controlEvent: ControlEvent<Void> { public var controlEvent: ControlEvent<Void> {
MainScheduler.ensureExecutingOnScheduler() MainScheduler.ensureExecutingOnScheduler()
let source = rx_lazyInstanceObservable(&rx_control_events_key) { () -> Observable<Void> in let source = lazyInstanceObservable(&rx_control_events_key) { () -> Observable<Void> in
Observable.create { [weak self] observer in Observable.create { [weak control = self.base] observer in
MainScheduler.ensureExecutingOnScheduler() MainScheduler.ensureExecutingOnScheduler()
guard let control = self else { guard let control = control else {
observer.on(.Completed) observer.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
let observer = ControlTarget(control: control) { control in let observer = ControlTarget(control: control) { control in
observer.on(.Next()) observer.on(.next())
} }
return observer return observer
}.takeUntil(self.rx_deallocated) }.takeUntil(self.deallocated)
} }
return ControlEvent(events: source) return ControlEvent(events: source)
@ -47,28 +47,28 @@ extension NSControl {
You might be wondering why the ugly `as!` casts etc, well, for some reason if 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. 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: (C) -> T, setter: (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() 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 return Observable.create { [weak weakControl = control] (observer: AnyObserver<T>) in
guard let control = weakControl else { guard let control = weakControl else {
observer.on(.Completed) observer.on(.completed)
return NopDisposable.instance return Disposables.create()
} }
observer.on(.Next(getter(control))) observer.on(.next(getter(control)))
let observer = ControlTarget(control: control as! NSControl) { _ in let observer = ControlTarget(control: control as! NSControl) { _ in
if let control = weakControl { if let control = weakControl {
observer.on(.Next(getter(control))) observer.on(.next(getter(control)))
} }
} }
return observer return observer
} }
.distinctUntilChanged() .distinctUntilChanged()
.takeUntil((control as! NSObject).rx_deallocated) .takeUntil((control as! NSObject).rx.deallocated)
} }
let bindingObserver = UIBindingObserver(UIElement: control, binding: setter) let bindingObserver = UIBindingObserver(UIElement: control, binding: setter)
@ -79,9 +79,9 @@ extension NSControl {
/** /**
Bindable sink for `enabled` property. Bindable sink for `enabled` property.
*/ */
public var rx_enabled: AnyObserver<Bool> { public var enabled: AnyObserver<Bool> {
return UIBindingObserver(UIElement: self) { (owner, value) in return UIBindingObserver(UIElement: self.base) { (owner, value) in
owner.enabled = value owner.isEnabled = value
}.asObserver() }.asObserver()
} }
} }

View File

@ -12,13 +12,13 @@ import RxSwift
#endif #endif
import Cocoa import Cocoa
extension NSImageView { extension Reactive where Base: NSImageView {
/** /**
Bindable sink for `image` property. Bindable sink for `image` property.
*/ */
public var rx_image: AnyObserver<NSImage?> { public var image: AnyObserver<NSImage?> {
return self.rx_imageAnimated(nil) return image(transitionType: nil)
} }
/** /**
@ -26,15 +26,39 @@ extension NSImageView {
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/ */
public func rx_imageAnimated(transitionType: String?) -> AnyObserver<NSImage?> { @available(*, deprecated, renamed: "image(transitionType:)")
return UIBindingObserver(UIElement: self) { control, value in public func imageAnimated(_ transitionType: String?) -> AnyObserver<NSImage?> {
return UIBindingObserver(UIElement: self.base) { control, value in
if let transitionType = transitionType { if let transitionType = transitionType {
if value != nil { if value != nil {
let transition = CATransition() let transition = CATransition()
transition.duration = 0.25 transition.duration = 0.25
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = transitionType transition.type = transitionType
control.layer?.addAnimation(transition, forKey: kCATransition) control.layer?.add(transition, forKey: kCATransition)
}
}
else {
control.layer?.removeAllAnimations()
}
control.image = value
}.asObserver()
}
/**
Bindable sink for `image` property.
- parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)
*/
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()
transition.duration = 0.25
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = transitionType
control.layer?.add(transition, forKey: kCATransition)
} }
} }
else { else {
@ -43,5 +67,4 @@ extension NSImageView {
control.image = value control.image = value
}.asObserver() }.asObserver()
} }
} }

View File

@ -1,27 +0,0 @@
//
// NSProgressIndicator+Rx.swift
// Rx
//
// Created by Junior B. on 21/06/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
import Cocoa
#if !RX_NO_MODULE
import RxSwift
#endif
extension NSProgressIndicator {
/**
Bindable sink for `progress` property
*/
public var rx_progress: AnyObserver<Double> {
return UIBindingObserver(UIElement: self) { progressView, progress in
progressView.doubleValue = progress
}.asObserver()
}
}

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