Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time
1242 lines (963 sloc) 56 KB

Change Log

All notable changes to this project will be documented in this file.


Use AtomicInt for BooleanDisposables to prevent potential rase condition. #2419


You can now use await on Observable-conforming objects (as well as Driver, Signal, Infallible, Single, Completable) using the following syntax:

do {
  for value in try await observable.values {
      print(value) // Next event
  // Completed here
} catch {
  // Error event
  print("An error occurred:", error.localizedDescription)

Check out the full documentation for additional information:



  • Deprecate withUnretained for Driver

Note: It is extremely rare to ship a breaking change in a patch release, but this is a relatively fresh feature with unusual circumstances. For the full story, see #2290.

Other changes

  • Add new subscribe(with:onNext:onError:onCompleted:onDisposed:) alternatives to withUnretained. This exists for all traits and types: Observable, Driver, Signal, Infallible, Completable, Single, Maybe #2290
  • Reactive now supports structs and value-types again, with the dynamic look-up specifically dealing with AnyObjects #2285
  • Fix xcframework support for RxCocoa (Drag in new RxCocoaRuntime.xcframework alongside RxCocoa)
  • Freeze MaybeEvent and CompletableEvent #2271 #2272
  • Fix missing RxCocoaRuntime.h header in RxCocoa podspec #2281
  • Remove invalid libswiftXCTest.dylib linking to support Xcode 12.5
  • Print URLRequest body httpBody, regardless of HTTP Method #2288


  • Support for XCFrameworks, with binaries now bundled with each release.
  • Updated tests for new Infallible trait.
  • Fix an issue building for watchOS.
  • Move URLSession logging settings to a more appropriate URLSession.rx.shouldLogRequest configurable closure.
  • README, CI, and additional house cleaning.


Note 1: RxSwift 6 and above has a minimum deployment target of iOS 9 and targets Swift 5.1 (Xcode 11) and above Note 2: Starting with RxSwift 6.x, RxSwift will no longer follow Swift versioning. Meaning, RxSwift can possibly move to v6, v7 or v8 while Swift itself is still in 5.x.

  • Minimum Swift version is now 5.1. #2077
  • Minimum deployment target is iOS 9.
  • Remove scoped imports in favor of library evolution. #2103
  • Reactive now uses @dynamicMemberLookup to provide automatic binders for most properties. #2110
  • Add ReplayRelay. #2109
  • Binder is now part of RxSwift itself, instead of RxCocoa only. #2110
  • Add ObservableConvertibleType conformance to SharedSequence. #2019
  • Add onDisposed closure argument to subscribe on Maybe, Completable and Single. #1977
  • Add and Signal.emit() for multiple observers/relays. #1962
  • Added defaultValue to sample to be returned when no new events occur between sampler ticks. #1457
  • Change return type of didFinishPickingMediaWithInfo Reactive Extension.
  • Fix a linking issue when swizzling observer methods. #2209
  • New decode(type:decoder:) operator for Observable<Data>.


  • Add KVO observation with Key Path.
  • Add distinctUntilChanged(at:) for Key Paths.
  • Fix DelegateProxy call to layoutIfNeeded for an object without a window. #2076
  • Add ControlEvent wrappers to UIApplication Notifications. #2116
  • SharingScheduler.mock(scheduler:action:) can use throwing function for action. #2150


  • Make NSTextView not weak for Swift 5.2 and up.
  • Add WKWebView navigation delegate reactive extensions. #2144

Note: We no longer guarantee support for Xcode 10.x. Maintaining these is counter-intuitive as they're over a year old and are ridden with bugs.



  • Reverts Carthage integration from using static to dynamic libraries. #1960


RxSwift 5 is a mostly source-compatible release targeting the Swift 5 compiler.

Xcode 10.2 is the minimum supported version (or Swift 5 on Linux).

If you're using Xcode 10.1 and below, please use RxSwift 4.5.

  • Relays have been moved to a separate framework - RxRelay, and can be used without RxCocoa. #1924
  • TimeInterval has been deprecated in favor of DispatchTimeInterval. For example - throttle(1.2) would change to throttle(.milliseconds(1200)), while throttle(3) would change to throttle(.seconds(3)). #1472
  • Variable is now entirely deprecated. #1922
  • do now provides additional "after" closures. For example, do(onNext:) and do(afterNext:). #1898
  • bind(to:) now supports multiple observers (e.g. bind(to: observer1, observer2)). #1702
  • Changes the return type of ObservableType.toArray to Single. #1923
  • Adds compactMap. #1925
  • Deprecate Completable.merge in favor of #1929 #1931
  • RxSwift can be built as a Static Library using Carthage 0.33 and up. #1940


  • SubjectType.SubjectObserverType has been renamed to SubjectType.Observer. #1950
  • The S associated type has been renamed to Subject where applicable. #1950
  • The S generic constraint on SharedSequence has been renamed to SharingStrategy. #1951
  • The E associated type on ObservableConvertibleType and ObserverType have been renamed to Element. #1945
  • The C and S associated types have been renamed to Collection and Sequence accordingly. #1949
  • Renamed ElementType associatedtype to Element. #1945
  • Renamed TraitType associatedtype to Trait. #1945
  • Make RxMutableBox supported on Linux in Swift 5. #1917
  • Fix incorrect assignment to Thread.threadDictionary on Linux. #1912
  • combineLatest of an empty array now completes immediately. #1879
  • Add resultsSelector missing closure labels for some overloads of combineLatest & zip.


  • Compatibility with Xcode 10.2.
  • Adds missing UISearchBar.setDelegate().


  • Adds UIView.rx.backgroundColor Binder. #1888


  • Fix multiple disposes on ScheduledDisposables. #1892
  • Fix DelegateProxy main thread validation. #1882
  • Bring back the first operator to ObservableType. #1886


  • Adds takeUntil(_ behavior:predicate:).


  • Fixes problems with RxAtomic and TSan. #1853
  • Fixes problem with passing 0 count to Observable.range. #1870
  • Fixes Swift 5.0 warnings. #1859
  • Fixes problem with RxCocoa and DISABLE_SWIZZLING flag. #1805
  • Internal cleanups:
    • Unused code deletions.
    • Adds SwiftLint.
    • Removes legacy Swift 3.0 conditional compilation flags.


This release introduces a new framework RxAtomic that enables using C11 atomic primitives in RxSwift as a replacement for deprecated OSAtomic* functions. Carthage users will probably need to include this framework manually.

  • Updates deprecated OSAtomic* primitives to use C11 atomic primitives.
  • Adds Event, SingleEvent, MaybeEvent and Recorded conditional conformance to Equatable where their Element is equatable on RXTest for clients that are using Swift >= 4.1.
  • Adds string to NSTextView.
  • Consolidates per platform frameworks to multi-platform frameworks.
  • Xcode 10.1 compatible.


  • Fixes problem with canceling events scheduled on serial scheduler through observeOn operator. #1778
  • Fixes problem with UISearchBar.text property not triggering update when cancel button is tapped. #1714
  • Updates watchos minimum target to 3.0. #1752



  • Fixes issues with CocoaPods and Swift 4.2 version.


  • Compatibility with Xcode 10.0
  • Adds new insert extension to collect and add multiple disposables to DisposeBag.
  • Removes string interpolation warning
  • Adds scan(into:accumulator:).
  • Adds queuePriority parameter (defaults to .normal) to OperationQueueScheduler.
  • Performance enhancement reduces Bag dispatch inline code size by 12%.
  • Adds customCaptureSubscriptionCallstack hook to allow custom subscription callstacks to be generated.
  • Remove usage of Variable from Playground, Example projects and Tests.
  • Add XCTAssertRecordedElements to XCTest+Rx.


  • Fix build issues on new arm64_32 architecture (watchOS 5).


  • Adds Smart Key Path subscripting to create a binder for property of object.
  • Adds UICollectionView extensions:
    • prefetchItems
    • cancelPrefetchingForItems
  • Adds UITableView extensions:
    • prefetchRows
    • cancelPrefetchingForRows
  • Fixes various spelling mistakes and missing parameters.
  • Adds UISegmentedControlExtensions:
    • titleForSegment(at:)
    • imageForSegment(at:)
  • Adds Maybe.ifEmpty(default:) operator.
  • Adds Maybe.ifEmpty(switchTo:) operator.
  • Adds Maybe.catchErrorJustReturn(_:) operator.
  • Add Single.flatMapMaybe(_:) operator.
  • Add Single.flatMapCompletable(_:) operator.
  • Add operator.
  • Add Single.catchErrorJustReturn(_:) operator.
  • Add Single.asMaybe(_:) operator.
  • Add Single.asCompletable(_:) operator.
  • Use editingEvents argument in controlPropertyWithDefaultEvents.


  • Lower macOS Deployment Target to 10.9
  • Deprecates UISegmentedControl.enabled(forSegmentAt:) in favor of UISegmentedControl.enabledForSegment(at:).


  • Adds deprecation warner.


  • Fixes ambiguity issue with and



  • Fixes compilation issue with Xcode 9.1.
  • Deprecates in favor of


  • Adds Recorded<Event<T>> array factory method in RxTest. #1531
  • Replaces global functions next, error, completed with, Recorded.error, Recorded.completed in RxTest. #1510
  • Removes AnyObject constraint from Delegate parameter on DelegateProxy. #1442
  • Adds ObservableType.bind(to:) overloads for PublishRelay and BehaviorRelay.
  • Adds ControlEvent.asSignal().
  • Adds UISegmentedControl.rx.enabled(forSegmentAt:) extension.
  • Adds UIStepper.rx.stepValue extension.
  • Adds error handling Hook to Single, Maybe and Completable. #1532
  • Adds recordCallStackOnError to improve performance of DEBUG configuration.


  • Changes return value of blocking version of single operator from E? to E. #1525
  • Removes deprecation attribute from asSharedSequence.


  • Adds global Hooks and implements error handling hook.
  • Deprecates asSharedSequence extensions on ObservableType.
  • Publicly exposes controlProperty.


  • Changes Observable extensions to ObservableType extensions.
  • Changes didUpdateFocusInContextWithAnimationCoordinator UITableView extension argument to UITableViewFocusUpdateContext.
  • Changes access modifier of DelegateProxy.setForwardToDelegate to open.


  • Deprecates image(transitionType:) in favor of image.
  • Changes return type of ignoreElements to Completable. #1436
  • Removes warning of sequence completion from Binder. #1431
  • Deprecates Variable in favor of BehaviorRelay.


  • Adds attributedText to UITextField. #1249
  • Adds attributedText to UITextView. #1249
  • Deprecates shareReplayLatestWhileConnected and shareReplay in favor of share(replay:scope:). #1430
  • Changes publish, replay, replayAll to clear state in case of sequence termination to be more consistent with other Rx implementations and enable retries. #1430
  • Replaces share with default implementation of share(replay:scope:). #1430
  • Adds HasDelegate and HasDataSource protocols.
  • Updates package version to v4 format. #1418


  • Adds deprecated warnings to API parts that were missing it. #1427
  • Improves memory handling in isScheduleRequiredKey. #1428
  • Removes pre-release identifier from bundle version to enable TestFlight submissions. #1424
  • Removes code coverage to enable TestFlight submissions. #1423
  • Fixes Xcode warnings. #1421


  • Adds materialize() operator for RxBlocking's BlockingObservable. #1383
  • Adds first operator to ObservableType.
  • Deprecates UIBindingObserver in favor of Binder. #1411
  • Adds another specialization of SharedSequence called Signal.
  • Refactors DelegateProxy to be type safe.
  • Changes nested SharedSequence strategy to use inner sharing strategy for result.


  • Call controlTextDidChange(…) as an optional method. #1406
  • Fixed issue with NSControl.rx.value regarding multiple observers. #1399
  • Removes useless extensions from PrimitiveSequence. #1248


  • Merge of 3.6.1 changes.
  • Adds UIScrollView.willEndDragging extension. #1365
  • Adds enumerated operator (deprecates skipWhileWithIndex, takeWhileWithIndex, flatMapWithIndex, mapWithIndex).


  • Fixes gesture recognizer extensions crash. #1382
  • Adds onSubscribed parameter to SharedSequence extensions.


  • Swift 4.0 compatibility
  • Changes delegate proxy to use plugin architecture.


  • Fixes public interface leakage of NSKeyValueObservingOptions. #1164



  • Fixes compilation issue with Xcode 9b3. #1341
  • Fixes issues with andThen operator. #1347
  • Improves locking behavior of merge and switch operators. #1344


  • Adds timeout operator to PrimitiveSequence (Single, Maybe, Observable)
  • Adds delay operator to SharedSequence.
  • Adds andThen operator to Completeable.
  • Adds concat operator to Completeable.
  • Adds RxPickerViewDataSourceType
  • Adds UIPickerView extensions:
    • modelSelected
    • itemTitles
    • itemAttributedTitles
    • items
  • Adds UITableView extensions:
    • modelDeleted
  • Adds UICollectionView extensions:
    • itemHighlighted
    • itemUnhighlighted
    • willDisplayCell
    • didEndDisplayingCell
    • willDisplaySupplementaryView
    • didEndDisplayingSupplementaryView
  • Adds UIScrollView extensions:
    • willBeginDecelerating
    • willBeginDragging
    • willBeginZooming
    • didEndZooming


  • Fixes deadlock anomaly in shareReplayWhileLatest. #1323
  • Removes duplicated events swallowing in NSControl on macOS.


  • Adds from operator on "SharedSequence"
  • Adds concat operator on "Completable"
  • Adds merge operator on "Completable"
  • Adds using operator on "PrimitiveSequence"
  • Adds concatMap operator.
  • Adds share(replay:scope:) operator.
  • Adds multicast(makeSubject:) operator.
  • Adds UIButton.image(for:) extension.
  • Adds UIButton.backgroundImage(for:) extension.
  • fixes typos


  • Improves reentrancy and synchronization checks.
  • Issues with share() and shareReplay(_:). #1111
  • .share() inconsistent in behavior. #1242
  • Fixes issues with Driver sometimes sending initial element async. #1253

3.4.1 (Xcode 8.3.1 / Swift 3.1 compatible)

  • Adds UINavigationController delegate proxy and extensions:
    • willShow
    • didShow
  • Deprecates TestScheduler.start(_:create:) in favor of TestScheduler.start(disposed:create:).
  • Deprecates TestScheduler.start(_:subscribed:disposed:create:) in favor of TestScheduler.start(created:subscribed:disposed:create:).


  • Fixes observable sequence completion in case of empty arrays for combineLatest and zip. #1205
  • Fixes array version of merge operator completing immediately in case one of the observable sequences is empty. #1221
  • Adds RxTest to SPM. #1215
  • Adds tuple version of operator (collection).
  • Adds tuple version of operator
  • Adds tuple version of operator SharedSequence.combineLatest (collection).
  • Adds tuple version of operator SharedSequence.combineLatest.
  • Adds missing trimOutput parameter to SharedSequence.debug.
  • Makes RxImagePickerDelegateProxy subclass of RxNavigationControllerDelegateProxy.

3.4.0 (Xcode 8.3.1 / Swift 3.1 compatible)

  • Xcode 8.3.1 / Swift 3.1 compatibility.
  • Add subscription closures for Single, Maybe and Completable (onSuccess, onError, onCompleted).
  • Rename Units as Traits and update the documentation for Single, Completable & Maybe.
  • Deprecates bindTo in favor of bind(to:).
  • Adds materialize operator
  • Adds dematerialize operator
  • Adds latest parameter to SharedSequence.throttle operator.
  • Adds debug operator to PrimitiveSequence.


  • Fixes problem with UICollectionView data source caching and disposal logic. #1154

3.3.1 (Xcode 8 / Swift 3.0 compatible)


  • Fixes misspelled Completeable to Completable. #1134

3.3.0 (Xcode 8 / Swift 3.0 compatible)

  • Adds Single, Maybe, Completable traits inspired by RxJava (operators):
    • create
    • deferred
    • just
    • error
    • never
    • delaySubscription
    • delay
    • do
    • filter
    • map
    • flatMap
    • observeOn
    • subscribeOn
    • catchError
    • retry
    • retryWhen
    • zip
  • Adds asSingle() operator on ObservableType.
  • Adds asMaybe() operator on ObservableType.
  • Adds asCompletable() operator on ObservableType.
  • Adds variadic combineLatest and zip overloads without result selector (defaults to tuple).
  • Adds array combineLatest and zip overloads with result selector (defaults to array of elements)
  • Adds optimized synchronous merge operator to observable sequence (variadic, array, collection). #579
  • Adds optimized synchronous merge operator to shared sequence (variadic, array, collection).
  • Adds AsyncSubject implementation.
  • Adds XCTAssertEqual overloads to RxTest.
  • Adds countDownDuration to UIDatePicker.
  • Adds attributedTitle(for:) to UIButton.
  • Adds onSubscribed to do operator.
  • Adds isUserInteractionEnabled to UIView.


  • Improves DelegateProxy responds(to:) selector logic to only respond to used selectors. #1081, #1087
  • Deprecates from() in favor of from(optional:) to avoid issues with implicit conversions to optional.
  • Fixes thread sanitizer reporting issues with merge operator. #1063
  • Calls collectionViewLayout.invalidateLayout() after reloadData() as a workaround for iOS 10 bug.
  • Changes UICollectionView.rx.didUpdateFocusInContextWithAnimationCoordinator context parameter type to UICollectionViewFocusUpdateContext

3.2.0 (Xcode 8 / Swift 3.0 compatible)

  • Adds groupBy operator
  • Adds ifEmpty(switchTo:) operator
  • Adds ifEmpty(default:) operator
  • Adds Disposable extension disposed(by:) equivalent to addDisposableTo that is meant to replace it in future 4.0 version.
  • Consolidates atomic operations on Linux and Darwin platform.
  • Adds DEBUG mode concurrent asserts for Variable and Observable.create.
  • Adds DEBUG mode concurrent asserts for Sink.
  • Small performance optimizations for subjects.
  • Adaptations for Xcode 8.3 beta.
  • Adds numberOfPages to UIPageControl.
  • Adds additional resources cleanup unit tests for cases where operators are used without DisposeBags.
  • Chroes:
    • Adds final keyword wherever applicable.
    • Remove unnecessary import Foundation statements.
    • Examples cleanup.


  • Improves behavior of shareReplayWhileConnected by making sure that events emitted after disconnect are ignored even in case of fast reconnect.
  • Fixes a couple of operators that were not cleaning up resources on terminal events when used without DisposeBags.
  • Fixes delegate proxy interaction with subclassing of UISearchController.
  • Fixes delegate proxy interaction with subclassing of NSTextStorage.
  • Fixes delegate proxy interaction with subclassing of UIWebView.
  • Fixes delegate proxy interaction with subclassing of UIPickerView.

3.1.0 (Xcode 8 / Swift 3.0 compatible)

  • Adds changed property to ControlProperty that returns ControlEvent of user generated changes.
    • { "User changed text to \($0)" }
  • Adds optional overloads for from operator. let num: Int? = 3; let sequence = Observable.from(num)
  • Improves UIBindingObserver by tolerating binding from non main dispatch queue. In case binding is attempted from non main dispatch queue it will be automagically dispathed async to main queue.
  • Makes control property naming consistent for UIDatePicker, UISearchBar, UISegmentedControl, UISwitch, UITextField, UITextView (value property + value alias name).
  • Adds missing extension to UIScrollView.
    • didScroll
    • didZoom
    • didEndDecelerating
    • didEndDragging
    • didScrollToTop
  • Renames refreshing to isRefreshing.
  • adds UIWebView extensions:
    • didStartLoad
    • didFinishLoad
    • didFailLoad
  • Adds UITabBarController extensions
    • willBeginCustomizing
    • willEndCustomizing
    • didEndCustomizing
    • didSelect
  • Adds UIBarButtonItem extensions
    • title
  • Performance optimizations
  • Improves data source behavior by clearing data source proxy when forwarding delegate is nil.


  • Fixes anomaly caused by UITableView invalid state caching of previous data source even after the change. Binding of reactive data source now triggers layoutIfNeeded that invalidates that internal cached state.
  • Fixes issue with race in AnyRecursiveScheduler. #995

3.0.1 (Xcode 8 / Swift 3.0 compatible)


  • Fixes RxCocoa problems on macOS (TextInput now uses NSTextInputClient)
  • Hides accidentally exposed BagKey structure.
  • Makes notification extension name parameter optional.

3.0.0 (Xcode 8 / Swift 3.0 compatible)

  • Prefixes boolean properties with is and makes String? properties consistent.
    • rx.hidden -> rx.isHidden
    • rx.enabled -> rx.isEnabled ... also ...
    • since rx.text has now type String? to be consistent with UIKit, in case String is needed there is rx.text.orEmpty that has String type.
  • Renames title(controlState:) on UIButton to title(for:).
  • All data structures are now internal (Bag, Queue, PriorityQueue ...)
  • Improves performance of Bag.
  • Polishes RxCocoa URLSession extensions
    • JSON -> json
    • return type is Any instead of AnyObject
    • replaces response tuple parameters, now it's (HTTPResponse, Data)
    • removes name hiding for request parameter
  • Migrates Driver and NSNotification tests to Linux.
  • Removes RxTest from OSX + SPM integration until usable XCTest support on OSX.
  • Renames to OberverType.mapObserver because of possible ambigutites with subjects.
  • Improves dispatch queue detection logic and replaces concept of threads in favor of dispatch queues (solves a lot of problems on Linux environment).
  • Replaces SectionedViewDataSourceType.model(_:) with SectionedViewDataSourceType.model(at:)
  • Renames OSX to macOS across the project.


  • Fixes wrong casing in #import "include/_RXObjCRuntime.h" (was creating issues for people with case sensitive file system). #949
  • Fixes issues with locking strategy for subjects. #936
  • Fixes code example in comments of RxTableViewExtensions that didn't compile. #947
  • Adds .swift-version to help package managers to detect Swift 3 version.

3.0.0-rc.1 (Xcode 8 / Swift 3.0 compatible)

  • Renames RxTests library to RxTest because of problems with Swift Package Manager.
  • Adds Swift Package Manager support
  • Adds Linux support
  • Replaces AnyObserver with UIBindingObserver in public interface.
  • Renames resourceCount to
  • Makes rx.text type consistent with UIKit String? type.
textField.rx.text          // <- now has type `ControlProperty<String?>`
textField.rx.text.orEmpty  // <- now has type `ControlProperty<String>`
  • Adds optional overloads for bindTo and drive. Now the following works:
let text: Observable<String> = Observable.just("")

// Previously `map { $0 }` was needed because of mismatch between sequence `String` type and `String?` type
// on binding `rx.text` observer.
   .disposed(by: disposeBag)


let text = Driver.just("")
   .disposed(by: disposeBag)
  • Adds trim output parameter to debug operator. #930
  • Renames NSDate to Date everywhere.
  • Renames scheduler init param globalConcurrentQueueQOS to qos and removes custom enum wrapper.
  • Adds setter to rx property to enable mutation of base object.

3.0.0-beta.2 (Xcode 8 / Swift 3.0 compatible)

  • Subscription disposables now only create strong references to sinks until being disposed or sequence terminates. #573

  • Introduces SharedSequence and makes Driver just a specialization of SharedSequence. That means Driver is now just one specific SharedSequence and it is now possible to easily create new concepts that have another compile time guarantees in a couple of lines of code. E.g. choosing a background scheduler on which elements are delivered, or choosing share as a sharing strategy instead of shareReplayLatestWhileConnected.

  • Moves Reactive struct and ReactiveCompatible from RxCocoa to RxSwift to enable third party consumers to remove RxCocoa dependency.

  • Add rx. extensions on Types.

  • Moves UIImagePickerViewController and CLLocationManager out of RxCocoa to RxExample project because of App Store submissions issues on iOS 10.

  • Adds sentMessage got its equivalent sequence methodInvoked that produces elements after method is invoked (vs before method is invoked).

  • Deprecates observe method on DelegateProxy in favor of sentMessage.

  • Adds simetric methodInvoked method on DelegateProxy that enables observing after method is invoked.

  • Moves all delegate extensions from using sentMessage to using methodInvoked (that fixes some problem with editing data sources)

  • Fixes problem with RxTableViewDataSourceProxy source enabling editing of table view cells (swipe on delete) even if there weren't any observers or forwardToDelegate wasn't implementing UITableViewDataSource.tableView(_:commit:forRowAt:). #907

  • Makes DelegateProxy open. #884

  • Deprecates extensions that were polluting Swift collection namespaces and moves them to static functions on Observable

    • Observable.combineLatest
    • Observable.concat
    • Observable.catchError (sequence version)
    • Observable.amb
  • Deprecates extensions that were polluting Swift collection namespaces and moves them to static functions on Driver

    • Driver.combineLatest
    • Driver.concat
    • Driver.catchError (sequence version)
    • Driver.amb
  • Update Getting Started document, section on creating an observable that performs work to Swift 3.0.

  • Removes stale installation instructions.

3.0.0-beta.1 (Xcode 8 GM compatible 8A218a)

  • Adapts to new Swift 3.0 syntax.
  • Corrects throttle operator behavior to be more consistent with other platforms. Adds latest flag that controls should latest element be emitted after dueTime.
  • Adds delay operator.
  • Adds UISearchBar extensions:
    • bookmarkButtonClicked
    • resultsListButtonClicked
    • textDidBeginEditing
    • textDidEndEditing
  • Moves CLLocationManager and UIImagePickerViewController extensions from RxCocoa to RxExample project. #874
  • Adds matrix CI builds. =======

3.0.0.alpha.1 (Xcode 8 beta 6 compatible 8S201h)


  • Modernizes API to be more consistent with Swift 3.0 API Design Guidelines
  • 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.
    • rx_text -> rx.text
    • rx_tap -> rx.tap
    • 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.
  • ...


  • There is a problem using UISwitch extensions because it seems that a bug exists in UIKit that causes all UISwitch instances to leak. #842



  • 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.


  • Fixes problem with UITable/CollectionView releasing of data sources when result subscription disposable wasn't retained.
  • Fixes all Xcode analyzer warnings



  • Exposes installForwardDelegate.
  • Adds proxyForObject as protocol extension and deprecates global function version.
  • Improves installForwardDelegate assert messaging.
  • Improves gesture recognizer extensions to use typed gesture recognizers in rx_event.
  • Adds RxTextInput protocol to enable creating reactive extensions for UITextInput/NSTextInput.
  • Adds rx_willDisplayCell and rx_didEndDisplayingCell extensions to UITableView.
  • Improves playgrounds.


  • Fixes in documentation.
  • Turns off Bitcode for RxTests CocoaPods integration.
  • Fixes UITextField.rx_text and UITextView.rx_text integrations to be more robust when used with two way binding.
  • Fixes two way binding example code so it now properly handles IME used in Asian cultures and adds explanations how to properly perform two way bindings. #649
  • Removes distinctUntilChanged from control extensions. #626



  • adds with Variable parameter.
  • exposes RxSearchBarDelegateProxy
  • adds rx_cancelButtonClicked to UISearchBar.
  • adds rx_searchButtonClicked to UISearchBar.
  • adds UISearchController extensions:
    • rx_didDismiss
    • rx_didPresent
    • rx_present
    • rx_willDismiss
    • rx_willPresent


  • Fixes anomaly with multicast disposing subscription.
  • Small grammar fixes in code.
  • Fixes in documentation.



  • Xcode 7.3 / Swift 2.2 support



  • Adds rx_badgeValue to UITabBarItem.
  • Adds rx_progress to UIProgresView.
  • Adds rx_selectedScopeButtonIndex to UISearchBar.
  • Adds asyncInstance to MainScheduler.
  • Makes name parmeter optional for rx_notification extension.
  • Adds
  • Adds
  • Updates playground inline documentation with running instructions.
  • Synchronizes copy of RxDataSources source files inside example project to 0.6 release.


  • Fixes anomaly with synchronization in disposable setter of SingleAssignmentDisposable.
  • Improves DelegateProxy memory management.
  • Fixes anomaly during two way binding of UITextView text value.
  • Improves single operator so it handles reentrancy better.


Public Interface anomalies

  • Fixes problem with timer operator. Changes return type from Observable<Int64> to Observable<T>. This could potentially cause code breakage, but it was an API anomaly.
  • Curried functions were marked deprecated so they were replaced in UITableView and UICollectionView extensions with equivalent lambdas. This shouldn't break anyone's code, but it is a change in public interface.

This is example of those changes:

- public func rx_itemsWithCellFactory<S : Sequence, O : ObservableType where O.E == S>
      (source: O)
      (cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable
+ public func rx_itemsWithCellFactory<S : Sequence, O : ObservableType where O.E == S>
      (source: O)
      -> (cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable
  • Fixes anomaly in CLLocationManager extensions
-    public var rx_didFinishDeferredUpdatesWithError: RxSwift.Observable<NSError> { get }
+    public var rx_didFinishDeferredUpdatesWithError: RxSwift.Observable<NSError?> { get }


  • Adds UIBindingObserver.
  • Adds doOnNext convenience operator (also added to Driver).
  • Adds doOnError convenience operator.
  • Adds doOnCompleted convenience operator (also added to Driver).
  • Adds skip, startWith to Driver.
  • Adds rx_active extension to NSLayoutConstraint.
  • Adds rx_refreshing extension to UIRefreshControl.
  • Adds interval and timer to Driver.
  • Adds rx_itemAccessoryButtonTapped to UITableView extensions.
  • Adds rx_networkActivityIndicatorVisible to UIApplication.
  • Adds rx_selected to UIControl.


  • Fixes anomaly with registering multiple observers to UIBarButtonItem.
  • Fixes anomaly with blocking operators possibly over-stopping the RunLoop.



  • Adds UIImagePickerController delegate wrappers.
  • Adds SectionedViewDataSourceType that enables third party data sources to use existing rx_modelSelected/rx_modelDeselected wrappers.
  • Adds rx_modelDeselected to UITableView
  • Adds rx_itemDeselected to UITableView
  • Adds rx_modelDeselected to UICollectionView
  • Adds rx_itemDeselected to UICollectionView
  • Adds rx_state to NSButton
  • Adds rx_enabled to NSControl
  • Adds UIImagePickerController usage example to Example app.


  • Removes usage of OSSpinLocks from all Darwin platforms because of problems with inversion of priority on iOS. Original thread on swift mailing list is here
  • Reduces verbose output from RxCocoa project in debug mode. TRACE_RESOURCES is now also treated as a verbosity level setting. It is possible to get old output by using TRACE_RESOURCES with verbosity level >= 2. #397
  • Fixes anomaly with logging of HTTP body of requests in RxCocoa project.



  • Changes package names to io.rx.[library]
  • Packages data sources from RxDataSourceStarterKit into it's own repository RxDataSources under RxSwiftCommunity.
  • Removes deprecated APIs.


  • Replaces hacky code that solved anomaly caused by interaction between autocorrect and text controls notification mechanism with proper solution. #333



  • Adds generic public func rx_sentMessage(selector: Selector) -> Observable<[AnyObject]> that enables observing of messages sent to any object. (This is enabled if DISABLE_SWIZZLING isn't set).
    • use cases like cell.rx_sentMessage("prepareForReuse") are now supported.
  • Linux support (proof of concept, but single threaded mode works)
  • Initial support for Swift Package Manager
    • works on Linux (RxSwift, RxBlocking, RxTests)
    • doesn't work on OSX because it can't compile RxCocoa and RxTests (because of inclusion of XCTest extensions), but OSX has two other package managers and manual method.
    • Project content is linked to Sources automagically using custom tool
    • more info in Documentation/
  • Adds VirtualTimeScheduler to RxSwift
  • Adds HistoricalScheduler to RxSwift
  • Improves performance of virtual schedulers using priority queue.
  • Adds new RxTests library to enable testing of custom Rx operators. This library contains everything needed to write unit tests in the following way:
func testMap() {
    let scheduler = TestScheduler(initialClock: 0)

    let xs = scheduler.createHotObservable([
        next(150, 1),
        next(210, 0),
        next(220, 1),
        next(230, 2),
        next(240, 4),

    let res = scheduler.start { { $0 * 2 } }

    let correctEvents = [
        next(210, 0 * 2),
        next(220, 1 * 2),
        next(230, 2 * 2),
        next(240, 4 * 2),

    let correctSubscriptions = [
        Subscription(200, 300)

    XCTAssertEqual(, correctEvents)
    XCTAssertEqual(xs.subscriptions, correctSubscriptions)
  • Adds test project for RxExample-iOS that demonstrates how to easily write marble tests using RxTests project.
let (

) = (
    scheduler.parseEventsAndTimes("e---u1----u2-----u3-----------------", values: stringValues).first!,
    scheduler.parseEventsAndTimes("e----------------------p1-----------", values: stringValues).first!,
    scheduler.parseEventsAndTimes("e---------------------------p2---p1-", values: stringValues).first!,
    scheduler.parseEventsAndTimes("------------------------------------", values: events).first!,

    scheduler.parseEventsAndTimes("e---v--f--v--f---v--o----------------", values: validations).first!,
    scheduler.parseEventsAndTimes("f--------------------------------t---", values: booleans).first!
  • Adds example app for GitHub signup example that shows the same example written with and without Driver.
  • Documents idea behind units and Driver in
  • Example of table view with editing is polished to use more functional approach.
  • Adds deferred to Driver unit.
  • Removes implicitly unwrapped optionals from CLLocationManager extensions.
  • Removes implicitly unwrapped optionals from NSURLSession extensions.
  • Polishes the debug operator format.
  • Adds optional cellType parameter to Table/Collection view rx_itemsWithCellIdentifier method.
  • Polish for calculator example in RxExample app.
  • Documents and adds unit tests for tail recursive optimizations of concat operator.
  • Moves Event equality operator to RxTests project.
  • Adds seealso references to
  • Polishes headers in source files and adds tests to enforce standard header format.
  • Adds driveOnScheduler to enable scheduler mocking for Driver during unit tests.
  • Adds assertions to drive* family of functions that makes sure they are always called from main thread.
  • Refactoring and polishing of internal ObjC runtime interception architecture.


  • Changes ConnectableObservable, generic argument is now type of elements in observable sequence and not type of underlying subject. (BREAKING CHANGE)

  • Removes RxBox and RxMutable box from public interface. (BREAKING CHANGE)

  • SchedulerType now isn't parametrized on Time and TimeInterval.

  • Deprecates Variable implementing ObservableType in favor of asObservable().

    • Now variable also sends .Completed to observable sequence returned from asObservable when deallocated. If you were (mis)using variable to return single value
      Variable(1).map { x in ... }
      ... you can just use just operator
      Observable.just(1).map { x in ... }
  • Deprecates free functions in favor of Observable factory methods, and deprecates versions of operators with hidden external parameters (scheduler, count) in favor of ones with explicit parameter names. E.g.

    Observable.just(1) instead of just(1)

    Observable.empty() instead of empty()

    Observable.error() instead of failWith()

    Observable.of(1, 2, 3) instead of sequenceOf(1, 2, 3)

    .debounce(0.2, scheduler: MainScheduler.sharedInstance) instead of .debounce(0.2, MainScheduler.sharedInstance)

    Observable.range(start:0, count: 10) instead of range(0, 10)

    Observable.generate(initialState: 0, condition: { $0 < 10 }) { $0 + 1 } instead of generate(0, condition: { $0 < 10 }) { $0 + 1 }

    Observable<Int>.interval(1, scheduler: MainScheduler.sharedInstance) instead of interval(1, MainScheduler.sharedInstance)


    If you want to continue using free functions form, you can define your free function aliases for Observable factory methods (basically copy deprecated methods).

  • Deprecates UIAlertView extensions.

    • These extensions could be stored locally if needed.
  • Deprecates UIActionSheet extensions.

    • These extensions could be stored locally if needed.
  • Deprecates rx_controlEvents in favor of rx_controlEvent.

  • Deprecates MainScheduler.sharedInstance in favor of MainScheduler.instance

  • Deprecates ConcurrentMainScheduler.sharedInstance in favor of ConcurrentMainScheduler.instance

  • Deprecates factory methods from Drive in favor of Driver factory methods.

  • Deprecates sampleLatest in favor of withLatestFrom.

  • Deprecates ScopedDisposable and scopedDispose() in favor of DisposeBag.


  • Improves and documents resource leak code in RxExample.
  • Replaces unowned reference with weak references in RxCocoa project.
  • Fixes debug operator not using __FILE__ and __LINE__ properly.
  • Fixes anomaly with timeout operator.
  • Fixes problem with spell-checker and UIText* losing focus.



  • Adds ignoreElements operator.
  • Adds timeout operator (2 overloads).
  • Adds shareReplayLatestWhileConnected operator.
  • Changes Driver to internally use shareReplayLatestWhileConnected for subscription sharing instead of shareReplay(1).
  • Adds flatMapFirst to Driver unit.
  • Adds replayAll operator.
  • Adds createUnbounded factory method to ReplaySubject.
  • Adds optional type hints to empty, failWith and never (empty(Int) now works and means empty observable sequence of Ints).
  • Adds rx_hidden to UIView.
  • Adds rx_alpha to UIView.
  • Adds rx_attributedText to UILabel.
  • Adds rx_animating to UIActivityIndicatorView.
  • Adds rx_constant to NSLayoutConstraint.
  • Removes implicitly unwrapped optional from NSURLSession.rx_response.
  • Exposes rx_createDataSourceProxy, rx_createDelegateProxy on UITableView/UICollectionView.
  • Exposes rx_createDelegateProxy on UITextView.
  • Exposes rx_createDelegateProxy on UIScrollView.
  • Exposes RxCollectionViewDataSourceProxy.
  • Exposes RxCollectionViewDelegateProxy.
  • Exposes RxScrollViewDelegateProxy.
  • Exposes RxTableViewDataSourceProxy.
  • Exposes RxTableViewDelegateProxy.
  • Deprecates proxyForObject in favor of proxyForObject<P : DelegateProxyType>(type: P.Type, _ object: AnyObject) -> P.
  • Deprecates rx_modelSelected<T>() in favor of rx_modelSelected<T>(modelType: T.Type).
  • Adds func bindTo(variable: Variable<E>) -> Disposable extension to ObservableType.
  • Exposes ControlEvent init.
  • Exposes ControlProperty init.
  • Refactoring of example app
    • Divides examples into sections
    • Adds really simple examples of how to do simple calculated bindings with vanilla Rx.
    • Adds really simple examples of table view extensions (sectioned and non sectioned version).
    • Refactoring of GitHub sign in example to use MVVM paradigm.


  • Fixes documentation for flatMapFirst
  • Fixes problem with delegate proxies not detecting all delegate methods in delegate proxy hierarchy.



  • Improves KVO mechanism.
    • Type of observed object is now first argument view.rx_observe(CGRect.self, "frame")
    • Support for observing ObjC bridged enums and RawRepresentable protocol
    • Support for easier extending of KVO using KVORepresentable protocol
    • Deprecates KVO extensions that don't accept type as first argument in favor of ones that do.
  • Adds flatMapLatest (also added to Driver unit).
  • Adds flatMapFirst operator (also added to Driver unit).
  • Adds retryWhen operator.
  • Adds window operator.
  • Adds single operator.
  • Adds single (blocking version) operator.
  • Adds rx_primaryAction on UIButton for tvOS.
  • Transforms error types in RxSwift/RxCocoa projects from NSErrors to Swift enum types.
    • RxError
    • RxCocoaError
    • RxCocoaURLError
    • ...
  • 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.
  • Adds overloads for just, sequenceOf, toObservable that accept scheduler.
  • Deprecates asObservable extension of Sequence in favor of toObservable.
  • Adds toObservable extension to Array.
  • Improves table view animated data source example.
  • Polishing of RxDataSourceStarterKit
    • differentiateForSectionedView operator
    • rx_itemsAnimatedWithDataSource extension
  • Makes blocking operators run current thread's runloop while blocking and thus disabling deadlocks.


  • Fixes example with Variable in playgrounds so it less confusing regarding memory management.
  • Fixes UIImageView extensions to use UIImage? instead of UIImage!.
  • Fixes improper usage of CustomStringConvertible and replaces it with CustomDebugStringConvertible.



  • Optimizations. System now performs significantly fewer allocations and is several times faster then 2.0.0-beta.1
  • Makes AnonymousObservable private in favor of create method.
  • Adds toArray operator (non blocking version).
  • Adds withLatestFrom operator, and also extends Driver with that operation.
  • Adds elementAt operator (non blocking version).
  • Adds takeLast operator.
  • Improves RxExample app. Adds retries example when network becomes available again.
  • Adds composite extensions to Bag (on, disposeAllIn).
  • Renames mistyped extension on ObserverType from onComplete to onCompleted.


  • Fixes minimal platform version in OSX version of library to 10.9



  • Adds Driver unit. This unit uses Swift compiler to prove certain properties about observable sequences. Specifically
    • that fallback error handling is put in place
    • results are observed on main thread
    • work is performed only when there is a need (at least one subscriber)
    • computation results are shared between different observers (replay latest element)
  • Renames ObserverOf to AnyObserver.
  • Adds new interface ObservableConvertibleType.
  • Adds BlockingObservable to RxBlocking and makes it more consistent with RxJava.
  • Renames func subscribe(next:error:completed:disposed:) to func subscribe(onNext:onError:onCompleted:onDisposed:)
  • Adds concat convenience method public func concat<O : ObservableConvertibleType where O.E == E>(second: O) -> RxSwift.Observable<Self.E>
  • Adds skipUntil operator.
  • Adds takeWhile operator.
  • Renames takeWhile indexed version to takeWhileWithIndex
  • Adds skipWhile operator.
  • Adds skipWhileWithIndex operator.
  • Adds using operator.
  • Renames func doOn(next:error:completed:) to func doOn(onNext:onError:onCompleted:).
  • Makes RecursiveImmediateSchedulerOf private.
  • Makes RecursiveSchedulerOf private.
  • Adds ConcurrentMainScheduler.
  • Adds overflow error so now in case of overflow, operators will return RxErrorCode.Overflow.
  • Adds rx_modelAtIndexPath to UITableView and UICollectionView.
  • Adds var rx_didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context:animationCoordinator:)> to UITableView and UICollectionView
  • Makes resultSelector argument in combineLatest explicit func combineLatest<O1, O2, R>(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R) -> RxSwift.Observable<R>.
  • Makes resultSelector argument in zip explicit func combineLatest<O1, O2, R>(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R) -> RxSwift.Observable<R>.
  • Adds activity indicator example in RxExample app.
  • Adds two way binding example in RxExample app.
  • many other small features


  • Problem with xcodebuild 7.0.1 treating tvOS shared schemes as osx schemes.



  • Adds tvOS support
  • Adds watchOS support
  • Adds auto loading example to example app
  • Restores old Variable behavior. Variable doesn't send anything on dealloc.
  • Adds performance tests target.
  • Adds more detailed resource tracing during unit tests (important for further optimizations).
  • Adds UIStepper extensions.
  • Adds UIBarButtonItem enabled property wrapper.
  • Adds response data to userInfo of error for rx_response extensions of NSURLSession.
  • Adds onNext, onError and onCompleted convenience methods to ObserverType.


  • Fixes problem on some systems with unregistering CurrentThreadScheduler from current thread.
  • Fixes retry parameter naming (maxAttemptCount).
  • Fixes a lot of unit test warnings.
  • Removes embedding of Swift library with built frameworks.



  • Renames ImmediateScheduler protocol to ImmediateSchedulerType
  • Renames Scheduler protocol to SchedulerType
  • Adds CurrentThreadScheduler
  • Adds generate operator
  • Cleanup of dead observer code.
  • Removes SpinLocks in disposables in favor of more performant OSAtomicCompareAndSwap32.
  • Adds buffer operator (version with time and count).
  • Adds range operator.
  • Adds repeat operator.



  • Renames ScopedDispose to ScopedDisposable
  • Deprecates observeSingleOn in favor of observeOn
  • Adds inline documentation
  • Renames from to asObservable extension method on Sequence
  • Renames catchErrorResumeNext in favor of catchErrorJustReturn
  • 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 sendNext on Variable in favor of just using value setter.
  • Renames rx_searchText to rx_text on UISearchBar+Rx.
  • Changes parameter type for rx_imageAnimated to be transitionType (kCATransitionFade, kCATransitionMoveIn, ...).



  • Problem in RxExample with missing observeOn for images.


  • Removes deprecated APIs
  • Adds ObservableType
  • Moved from using >- operator to protocol extensions
  • Change from disposeBag.addDisposable to disposable.addDisposableTo
  • Changes in RxCocoa extensions to enable fluent style
  • Rename of do* to doOn*
  • Deprecates returnElement in favor of just
  • Deprecates aggregate in favor of reduce
  • Deprecates variable in favor of shareReplay(1) (to be consistent with RxJS version)
  • Method next on Variable in favor of sendNext




  • Adds Calculator example app
  • Performance improvements for Queue


  • Crash in rx_didChangeAuthorizationStatus. #89