RxSwift Fact Sheet
• Swift Support: 2.3, 3.0 (Beta)
• Code Quality: see CocoaPods
• Contributors & Activity: see GitHub
• External Dependencies: Non
• Usage via CocoaPods, Carthage, Git Submodules
• Community Extentions
Slide 6
Slide 6 text
Basic Concepts
Slide 7
Slide 7 text
Observable Sequences:
Push vs. Pull 1
• Observable eq. SequenceType
• ObservableType.subscribe
• eq. SequenceType.generate
• vs. generator.next
• But can also receive elements asynchronously!
1 RxSwift Getting Started
Slide 8
Slide 8 text
Events
next* (error | completed)?
• Sequences can have 0 or more elements
• Once an error or completed event is received, the sequence
cannot produce any other element
Slide 9
Slide 9 text
Examples2
Observable.of(1, 2, 3)
.subscribe { print($0) }
will print
next(1)
next(2)
next(3)
completed
2 using RxSwift 3.0.0-beta.1
Slide 10
Slide 10 text
Disposing
release all allocated resources:
Observable.of(1, 2 ,3)
.subscribe { print($0) }
.dispose()
or better
let disposeBag = DisposeBag()
Observable.of(1, 2 ,3)
.subscribe { print($0) }
.addDisposableTo(disposeBag)
Sequence Generation
When does an Observable begin emitting its items?4
"Cold" Observable:
waits until an observer subscribes
"Hot" Observable:
may begin emitting items as soon as created
4 See also Hot and Cold Observables
Slide 14
Slide 14 text
Cold Observables
let disposeBag = DisposeBag()
let observable = Observable.of(1, 2)
observable.subscribe { print($0) }.addDisposableTo(disposeBag)
observable.subscribe { print($0) }.addDisposableTo(disposeBag)
will print
next(1)
next(2)
completed
next(1)
next(2)
completed
Slide 15
Slide 15 text
"Hot" Observables
let pub = PublishSubject()
pub.onNext(1)
let sub1 = pub.subscribe { print("sub1: \($0)") }
pub.onNext(2)
let sub2 = pub.subscribe { print("sub2: \($0)") }
pub.onNext(3)
sub2.dispose()
pub.onCompleted()
will print
sub1: next(2)
sub1: next(3)
sub2: next(3)
sub1: completed
Schedulers5
Schedulers abstract away the mechanism for performing work
• CurrentThreadScheduler: serial on current thread
• MainScheduler: serial on main thread
• SerialDispatchQueueScheduler: serial on dispatch queue
• ConcurrentDispatchQueueScheduler: concurrent on dispatch queue
• OperationQueueScheduler: concurrent on operation queue
5 https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md
Slide 23
Slide 23 text
Observe On Scheduler
sequence
.observeOn(backgroundScheduler)
.map { _ in
print("This is performed on backgroundScheduler")
}
.observeOn(MainScheduler.instance)
.map { _ in
print("This is performed on the main thread")
}
Slide 24
Slide 24 text
Observe On Scheduler
let scheduler = SerialDispatchQueueScheduler(internalSerialQueueName:
"com.rewe-digital.rxswift.interval")
let subscription = Observable.interval(0.3, scheduler: scheduler)
.map { "Simply \($0)"}
.subscribe(onNext: { print($0) })
Thread.sleep(forTimeInterval: 1.0)
subscription.dispose()
will print
Simply 0
Simply 1
Simply 2
Units
Important properties when writing Cocoa/UIKit applications:
• Subscribe to properties, events on main thread
• Observe on main thread
• Share events
• Don't error out
Slide 31
Slide 31 text
Units
Units6 are convenient wrapper around observables for writing
UI code
• ControlProperty
• ControlEvent
• Driver
6 https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Units.md
Problems with this code ...
• If fetchItems errors out, everything would unbind
• If it returns on some background thread, results would be
bound to UI there
• Results are bound to two UI elements, so two HTTP requests
would be made