<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Shai Mishali</title>
    <description>The latest articles on Forem by Shai Mishali (@freak4pc).</description>
    <link>https://forem.com/freak4pc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F351724%2Ff0bfc585-64d3-4aed-9963-27c993a8828a.jpeg</url>
      <title>Forem: Shai Mishali</title>
      <link>https://forem.com/freak4pc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/freak4pc"/>
    <language>en</language>
    <item>
      <title>What's new in RxSwift 6 ?</title>
      <dc:creator>Shai Mishali</dc:creator>
      <pubDate>Fri, 01 Jan 2021 14:03:53 +0000</pubDate>
      <link>https://forem.com/freak4pc/what-s-new-in-rxswift-6-2nog</link>
      <guid>https://forem.com/freak4pc/what-s-new-in-rxswift-6-2nog</guid>
      <description>&lt;p&gt;Happy new 2021! It's been quite a rough year, and I'm sure we're all hoping for a much better year where we'll finally be able to go to our normal lives.&lt;/p&gt;

&lt;p&gt;To kick off the year, what's better than starting with a new release? &lt;a href="https://github.com/ReactiveX/RxSwift/releases/tag/6.0.0" rel="noopener noreferrer"&gt;Say hello to RxSwift 6&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This blog post will give you a quick rundown of some of the most note-worthy changes that might affect you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is just a partial list of some interesting changes, that obviously don't include a massive amount of smaller bug fixes and improvements.&lt;/p&gt;

&lt;p&gt;For the full change log, checkout the &lt;a href="https://github.com/ReactiveX/RxSwift/releases/tag/6.0.0" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without further ado, let's just dive right in!&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Content
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New logo!&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Binder&lt;/code&gt; moves from RxCocoa to RxSwift&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;withUnretained&lt;/code&gt; comes to RxSwift&lt;/li&gt;
&lt;li&gt;Automatic synthesis of &lt;code&gt;Binder&lt;/code&gt;s using &lt;code&gt;@dynamicMemberLookup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Infallible&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;decode(type:decoder:)&lt;/code&gt; operator for &lt;code&gt;Observable&amp;lt;Data&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Variadic &lt;code&gt;drive()&lt;/code&gt; and &lt;code&gt;emit()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Single&lt;/code&gt; now better follows Swift's &lt;code&gt;Result&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;distinctUntilChange(at:)&lt;/code&gt; operator for Key Paths&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;ReplayRelay&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;DisposeBag&lt;/code&gt; function builder&lt;/li&gt;
&lt;li&gt;Many, many (many) operator renames&lt;/li&gt;
&lt;li&gt;Better support for XCFrameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New logo!
&lt;/h3&gt;

&lt;p&gt;Not a technical change, for sure, but definitely one worth mentioning.&lt;/p&gt;

&lt;p&gt;RxSwift always used Reactive Extensions' original Volta Eel logo, but I felt that this major release can be a great opportunity to add a bit of a unique edge to RxSwift's logo.&lt;/p&gt;

&lt;p&gt;An opportunity to make it unique with its own spirit and identity, in a way that still gives honor to the original ReactiveX logo as well as Swift's logo.&lt;/p&gt;

&lt;p&gt;I give you, the new RxSwift logo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxt6qirm3yfvnxyc5dhrd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxt6qirm3yfvnxyc5dhrd.gif" alt="ezgif-2-d5c1852097c8"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Binder&lt;/code&gt; moves from RxCocoa to RxSwift
&lt;/h3&gt;

&lt;p&gt;This is a small but highly requested change that just made sense. &lt;code&gt;Binder&lt;/code&gt;, as the name suggests, lets you define a way to bind an &lt;code&gt;Observable&lt;/code&gt; stream into it, to reactively feed that bound input.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isButtonEnable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;myButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEnabled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Uses an underlying &lt;code&gt;Binder&lt;/code&gt; to let you bind into &lt;code&gt;rx.isEnabled&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Binder&lt;/code&gt; always lived inside &lt;code&gt;RxCocoa&lt;/code&gt;, but use-cases by our community and various discussions showed that it is a super useful entity that serves the broader RxSwift audience, so it is now part of it and RxCocoa isn't required to use &lt;code&gt;Binder&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Automatic synthesis of &lt;code&gt;Binder&lt;/code&gt;s using &lt;code&gt;@dynamicMemberLookup&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;RxSwift includes a namespace called &lt;code&gt;.rx&lt;/code&gt; which lets you put your own Reactive Extensions on it for specific objects.&lt;/p&gt;

&lt;p&gt;For example, given a custom &lt;code&gt;MyView&lt;/code&gt; that looks like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;MyView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIImage&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A common pattern for creating reactive binders usually looks like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;Reactive&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="kt"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;MyView&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
           &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subtitle&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
           &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subtitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subtitle&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;UIImage&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="kt"&gt;Binder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;icon&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
           &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;icon&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This would let you bind an observable stream of the appropriate type to the various reactive inputs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;myView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;myView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This works great, and is even how &lt;a href="https://github.com/ReactiveX/RxSwift/blob/5.1.0/RxCocoa/iOS/UILabel%2BRx.swift#L14-L30" rel="noopener noreferrer"&gt;RxCocoa itself provides reactive binders for its consumers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, this sort of code is also quite repetitive and boilerplate-y. All it &lt;em&gt;really&lt;/em&gt; does is mirror the underlying &lt;code&gt;Base&lt;/code&gt;'s properties. &lt;/p&gt;

&lt;p&gt;Fortunately, since Swift 5.1, we have a better solution for this problem - &lt;a href="https://github.com/apple/swift-evolution/blob/master/proposals/0252-keypath-dynamic-member-lookup.md" rel="noopener noreferrer"&gt;&lt;code&gt;@dynamicMemberLookup&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;RxSwift 6 will &lt;strong&gt;automatically synthesize all of these &lt;code&gt;Binder&lt;/code&gt;s for any class&lt;/strong&gt;, which means that all of the &lt;code&gt;Binder&lt;/code&gt; code I showed above can be entirely removed, and really clean up your code. &lt;/p&gt;

&lt;p&gt;Just start writing &lt;code&gt;.rx&lt;/code&gt; on any &lt;code&gt;AnyObject&lt;/code&gt;-inheriting class, and you'll immediately see automatically synthesized binders for every property of the extended base object:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffmifbl4wsgt2m2q8lvm8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffmifbl4wsgt2m2q8lvm8.jpg" alt="Automatically synthesized binders for all properties of MyView"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Don't worry though, your own custom reactive extensions still take precedence over the synthesized dynamic member ones, which lets you have more granular control.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;withUnretained&lt;/code&gt; comes to RxSwift
&lt;/h3&gt;

&lt;p&gt;A common pattern when working with RxSwift and Cocoa / iOS code is to get a weak reference to &lt;code&gt;self&lt;/code&gt; so you could pass an emitted value to the owner, for example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;importantInfo&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;onNext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;weak&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doImportantTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disposed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disposeBag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Be careful using this operator with a buffering operator such as &lt;code&gt;share(replay: 1)&lt;/code&gt; as it would also buffer the retained object, which might cause a retain cycle. If you want a simpler alternative to this, check out &lt;a href="https://docs.rxswift.org/protocols/observabletype#/s:7RxSwift14ObservableTypePAAE9subscribe4with6onNext0G5Error0G9Completed0G8DisposedAA10Disposable_pqd___yqd___7ElementQztcSgyqd___s0I0_ptcSgyqd__cSgAPtRld__ClF" rel="noopener noreferrer"&gt;&lt;code&gt;subscribe(with:onNext:onError:onCompleted:onDisposed:)&lt;/code&gt; from RxSwift 6.1&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This might seem fine for a single output, but imagine how frequently this pops in a single code base. &lt;/p&gt;

&lt;p&gt;Luckily &lt;a href="https://github.com/RxSwiftComunity/RxSwiftExt" rel="noopener noreferrer"&gt;RxSwiftExt&lt;/a&gt;, a community project that holds various additional operators that aren't part of RxSwift itself, has an operator for this very case, called &lt;code&gt;withUnretained&lt;/code&gt;. It was &lt;a href="https://github.com/RxSwiftCommunity/RxSwiftExt/pull/149" rel="noopener noreferrer"&gt;initially implemented&lt;/a&gt; by a good friend and fellow iOS speaker, &lt;a href="https://twitter.com/v_pradeilles" rel="noopener noreferrer"&gt;Vincent Pradeilles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Due to the popularity of this operator, and how common this use case is, it made sense to bring it into RxSwift itself. &lt;/p&gt;

&lt;p&gt;Starting with RxSwift 6, you can rewrite the above code like so:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;importantInfo&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withUnretained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Tuple of (Object, Element)&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;onNext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
    &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doImportantTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disposed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disposeBag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Much cleaner!&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;Infallible&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Infallible&lt;/code&gt; is a new type of stream that is identical to &lt;code&gt;Observable&lt;/code&gt; with only one difference — it is guaranteed to not fail. This means you cannot emit errors from it, guaranteed by the compiler.&lt;/p&gt;

&lt;p&gt;For example, you can create one similarly to &lt;code&gt;Observable.create&lt;/code&gt;, using &lt;code&gt;Infallible.create&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kt"&gt;Infallible&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;observer&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// No way to error here&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;Disposables&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Clean-up&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note that you can only pass a &lt;code&gt;.next(Element)&lt;/code&gt; or &lt;code&gt;.completed&lt;/code&gt; event. There is no way for you to fail this stream. All other operators that work around &lt;code&gt;Infallible&lt;/code&gt; have the same guarantee (for example, you cannot call &lt;code&gt;Infallible.error&lt;/code&gt; as opposed to &lt;code&gt;Observable.error&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;If you worked with RxCocoa, you're probably thinking — hey, what's the difference between this, &lt;code&gt;Driver&lt;/code&gt;, and &lt;code&gt;Signal&lt;/code&gt;? &lt;/p&gt;

&lt;p&gt;First of all, &lt;code&gt;Infallible&lt;/code&gt; lives inside RxSwift, while the other two live in RxCocoa. But more importantly, both &lt;code&gt;Driver&lt;/code&gt; and &lt;code&gt;Signal&lt;/code&gt; always use the &lt;code&gt;MainScheduler&lt;/code&gt; and share their resources (using &lt;code&gt;share()&lt;/code&gt;). This isn't the case with Infallible which is entirely a basic observable, only with compile-time guarantee for infallibility. &lt;/p&gt;
&lt;h3&gt;
  
  
  New &lt;code&gt;decode(type:decoder:)&lt;/code&gt; operator for &lt;code&gt;Observable&amp;lt;Data&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;RxSwift 6 adds a &lt;code&gt;decode&lt;/code&gt; operator that specifically works on &lt;code&gt;Observable&lt;/code&gt;s that emit &lt;code&gt;Data&lt;/code&gt;, similarly to &lt;code&gt;Combine&lt;/code&gt;'s:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchJSONUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Observable&amp;lt;Data&amp;gt;&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;JSONDecoder&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;// Observable&amp;lt;[User]&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Variadic &lt;code&gt;drive()&lt;/code&gt; and &lt;code&gt;emit()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;RxSwift 5 introduced variadic &lt;code&gt;bind&lt;/code&gt;, which lets you do:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;RxSwift 6 now brings the same variadic binding for &lt;code&gt;Driver&lt;/code&gt;s and &lt;code&gt;Signal&lt;/code&gt;s - using variadic &lt;code&gt;drive&lt;/code&gt; and &lt;code&gt;emit&lt;/code&gt; operators:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;viewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Single&lt;/code&gt; now better follows Swift's &lt;code&gt;Result&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Up until RxSwift 5, &lt;code&gt;Single&lt;/code&gt; had a custom event:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;SingleEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Element&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Swift&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you're looking at this and saying, hey - this looks a lot like a &lt;code&gt;Result&amp;lt;Element, Swift.Error&amp;gt;&lt;/code&gt;, you're absolutely right!&lt;/p&gt;

&lt;p&gt;Starting with RxSwift 6, &lt;code&gt;SingleEvent&lt;/code&gt; is simply an alias for &lt;code&gt;Result&amp;lt;Element, Swift.Error&amp;gt;&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This change is also reflected in other APIs such as &lt;code&gt;subscribe&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// RxSwift 5&lt;/span&gt;
&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Got a value: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nv"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something went wrong: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// RxSwift 6&lt;/span&gt;
&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Got a value: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nv"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something went wrong: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  New &lt;code&gt;distinctUntilChange(at:)&lt;/code&gt; operator for Key Paths
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;distinctUntilChanged&lt;/code&gt; is a super useful operator which lets you drop identical value emissions to avoid wastefully processing them.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;myStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distinctUntilChanged&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;searchTerm&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;searchTerm&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is another case where Key Paths can prove quite useful. Starting with RxSwift 6, you can simply write:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;myStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;distinctUntilChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  New &lt;code&gt;ReplayRelay&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Relays wrap around subjects, and let you relay messages in a way that only handles values, since relays are guaranteed to never fail or complete.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ReplayRelay&lt;/code&gt; is the latest addition to RxSwift 6, which wraps &lt;code&gt;ReplaySubject&lt;/code&gt;, in addition to the existing &lt;code&gt;BehaviorRelay&lt;/code&gt; and &lt;code&gt;PublishRelay&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Creating one uses the exact same interface as creating a &lt;code&gt;ReplaySubject&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Subject&lt;/span&gt;
&lt;span class="kt"&gt;ReplaySubject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bufferSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Relay&lt;/span&gt;
&lt;span class="kt"&gt;ReplayRelay&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bufferSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  New &lt;code&gt;DisposeBag&lt;/code&gt; function builder
&lt;/h3&gt;

&lt;p&gt;RxSwift 6 includes a new &lt;code&gt;DisposeBag&lt;/code&gt; function builder for SwiftUI-like, comma-less syntax:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;disposeBag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;DisposeBag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;observable1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;observable2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;observable3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;onNext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Got &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Also works for insertions&lt;/span&gt;
&lt;span class="n"&gt;disposeBag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;observable4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;observable5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Many, many (many) operator renames
&lt;/h3&gt;

&lt;p&gt;We took the time in RxSwift 6 and renamed many operators to better respect Swift's code guidelines where possible.&lt;/p&gt;

&lt;p&gt;Here is a mostly complete list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;RxSwift 5&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;RxSwift 6&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;catchError(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;catch(_:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;catchErrorJustReturn(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;catchAndReturn(_:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elementAt(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;element(at:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retryWhen(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;retry(when:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;takeUntil(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;take(until:&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;takeUntil(behavior:_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;take(until:behavior:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;takeWhile(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;take(while:&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;takeWhile(behavior:_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;take(while:behavior:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;take(.seconds(3))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;take(for: .seconds(3)&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skipWhile(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;skip(while:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;takeUntil(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;take(until:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;observeOn(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;observe(on:&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subscribeOn(_:)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;subscribe(on:)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Better support for XCFrameworks
&lt;/h3&gt;

&lt;p&gt;Every release of RxSwift 6 will now have a set of XCFrameworks bundled with the release. &lt;/p&gt;

&lt;p&gt;This allows easily linking against a prebuilt copy of RxSwift without worrying about forward compatibility when upgrading to the next version of Swift, thanks to binary module stability.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wrapping up!
&lt;/h2&gt;

&lt;p&gt;Hope you've enjoyed this quick rundown of some of the most interesting features and updates to RxSwift 6, but it's not all that was fixed.&lt;/p&gt;

&lt;p&gt;There are a &lt;em&gt;ton&lt;/em&gt; of bug fixes, improvements and small additions that are worth checking out. Be sure to take a moment to review the &lt;a href="https://github.com/ReactiveX/RxSwift/releases/tag/6.0.0" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ReactiveX" rel="noopener noreferrer"&gt;
        ReactiveX
      &lt;/a&gt; / &lt;a href="https://github.com/ReactiveX/RxSwift" rel="noopener noreferrer"&gt;
        RxSwift
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Reactive Programming in Swift
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/ReactiveX/RxSwift/blob/main/assets/RxSwift_Logo.png?raw=true"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FReactiveX%2FRxSwift%2Fraw%2Fmain%2Fassets%2FRxSwift_Logo.png%3Fraw%3Dtrue" width="35%" alt="RxSwift Logo"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://actions-badge.atrox.dev/ReactiveX/RxSwift/goto" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://github.com/ReactiveX/RxSwift/workflows/RxSwift/badge.svg?branch=main" alt="Build Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4df1fbe874cd79f89009343a28ff8f2a7697b84a56d43897833ac805569c256f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d732d694f532532302537432532306d61634f5325323025374325323074764f5325323025374325323077617463684f532532302537432532304c696e75782d3333333333332e737667"&gt;&lt;img src="https://camo.githubusercontent.com/4df1fbe874cd79f89009343a28ff8f2a7697b84a56d43897833ac805569c256f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d732d694f532532302537432532306d61634f5325323025374325323074764f5325323025374325323077617463684f532532302537432532304c696e75782d3333333333332e737667" alt="Supported Platforms: iOS, macOS, tvOS, watchOS &amp;amp; Linux"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="https://cocoapods.org/pods/RxSwift" alt="RxSwift on CocoaPods" title="RxSwift on CocoaPods" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e9e7ce455fcf22cc6c16b4b7542ab9d569ee4ae2e65ee6fed00764e5d2393817/68747470733a2f2f696d672e736869656c64732e696f2f636f636f61706f64732f762f527853776966742e737667"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Carthage/Carthage" alt="RxSwift on Carthage" title="RxSwift on Carthage" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5cb89494518efc818a124fd801726287be9482423d1a161a6dec2066aa0f30db/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f43617274686167652d636f6d70617469626c652d3442433531442e7376673f7374796c653d666c6174"&gt;&lt;/a&gt;
&lt;a href="https://github.com/swiftlang/swift-package-manager" alt="RxSwift on Swift Package Manager" title="RxSwift on Swift Package Manager" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b77f3cd38bd8253e01a3574b97af1b311e99d45fb88d87de49bba39b9f1dae0e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53776966742532305061636b6167652532304d616e616765722d636f6d70617469626c652d627269676874677265656e2e737667"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Rx is a &lt;a href="https://youtu.be/looJcaeboBY" rel="nofollow noopener noreferrer"&gt;generic abstraction of computation&lt;/a&gt; expressed through &lt;code&gt;Observable&amp;lt;Element&amp;gt;&lt;/code&gt; interface, which lets you broadcast and subscribe to values and other events from an &lt;code&gt;Observable&lt;/code&gt; stream.&lt;/p&gt;
&lt;p&gt;RxSwift is the Swift-specific implementation of the &lt;a href="http://reactivex.io" rel="nofollow noopener noreferrer"&gt;Reactive Extensions&lt;/a&gt; standard.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ReactiveX/RxSwift/blob/main/assets/example.png?raw=true"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FReactiveX%2FRxSwift%2Fraw%2Fmain%2Fassets%2Fexample.png%3Fraw%3Dtrue" width="55%" alt="RxSwift Observable Example of a price constantly changing and updating the app's UI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While this version aims to stay true to the original spirit and naming conventions of Rx, this project also aims to provide a true Swift-first API for Rx APIs.&lt;/p&gt;
&lt;p&gt;Cross platform documentation can be found on &lt;a href="http://reactivex.io/" rel="nofollow noopener noreferrer"&gt;ReactiveX.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like other Rx implementations, RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of &lt;code&gt;Observable&lt;/code&gt; objects and a suite of methods to transform and compose these pieces of asynchronous work.&lt;/p&gt;
&lt;p&gt;KVO observation, async operations, UI Events and other streams of data are all unified under &lt;a href="https://github.com/ReactiveX/RxSwiftDocumentation/GettingStarted.md#observables-aka-sequences" rel="noopener noreferrer"&gt;abstraction of sequence&lt;/a&gt;. This is the reason why Rx is so simple, elegant and powerful.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;I came here because I want to&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ReactiveX/RxSwift" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;See you on the next blog post, and hope you enjoy RxSwift 6! &lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>rxswift</category>
      <category>functional</category>
    </item>
    <item>
      <title>CombineExt: An open-source collection of operators and custom publishers missing in Apple's Combine framework!</title>
      <dc:creator>Shai Mishali</dc:creator>
      <pubDate>Tue, 17 Mar 2020 06:44:13 +0000</pubDate>
      <link>https://forem.com/freak4pc/combineext-an-open-source-collection-of-operators-and-custom-publishers-missing-in-apple-s-combine-framework-4lp</link>
      <guid>https://forem.com/freak4pc/combineext-an-open-source-collection-of-operators-and-custom-publishers-missing-in-apple-s-combine-framework-4lp</guid>
      <description>&lt;p&gt;CombineExt provides a collection of operators, publishers and utilities for Combine, that are not provided by Apple themselves, but are common in other Reactive Frameworks and standards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CombineCommunity/CombineExt"&gt;https://github.com/CombineCommunity/CombineExt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original inspiration for many of these additions came from my journey investigating Combine after years of RxSwift and ReactiveX usage.&lt;/p&gt;

&lt;p&gt;All operators, utilities and helpers respect Combine's publisher contract, including backpressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;withLatestFrom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flatMapLatest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assign&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;materialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;values&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;failures&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dematerialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;partition&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Publishers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AnyPublisher.create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CurrentValueRelay&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PassthroughRelay&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>opensource</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
