Hello • Frederik Jacques • Lecturer Devine (Howest University College) • Living in The Netherlands (what was I thinking) • Freelance iOS consultant • Currently working at Nederlandse Spoorwegen frederik jacques - @thenerd_be 3
Here we are observing a certain event. NotificationCenter.default .addObserver( forName: Notification.Name.UserDidLogin, object: self, queue: nil ) { (notification) in print("User did login") } frederik jacques - @thenerd_be 13
Observable • The key element of RxSwift • Concept? • Produce a sequence of immutable events • 3 types of event: next, completed & error frederik jacques - @thenerd_be 17
Variable • Putting it all together let names = Variable(["Frederik"]) names.asObservable() .subscribe(onNext: { (theNames) in print(theNames) }) names.value.append("Tom") names.value.append("Spencer") frederik jacques - @thenerd_be 29
PublishSubject • Subscribers get all the upcoming events (NOT the current one) let nameSubject = PublishSubject() • Add data on the stream with onNext method nameSubject.onNext("Frederik") frederik jacques - @thenerd_be 30
PublishSubject let nameSubject = PublishSubject() nameSubject.onNext("Frederik") nameSubject.subscribe(onNext: { (name) in print("Name = \(name)") }) nameSubject.onNext("Steven") frederik jacques - @thenerd_be 31
PublishSubject let nameSubject = PublishSubject() nameSubject.subscribe(onNext: { (name) in print("Name = \(name)") }) nameSubject.onNext("Frederik") nameSubject.onNext("Steven") frederik jacques - @thenerd_be 32
BehaviorSubject • Subscribers get all upcoming events + the current value let nameSubject = BehaviorSubject(value: "Frederik") • Add data on the stream with onNext method nameSubject.onNext("Steven") frederik jacques - @thenerd_be 33
ReplaySubject • Subscribers get all upcoming events + the amount specified in the buffer from earlier events let nameSubject = ReplaySubject.create(bufferSize: 2) • Add data on the stream with onNext method nameSubject.onNext("Frederik") frederik jacques - @thenerd_be 35
Disposebags A container in which your subscriptions are stored, so they don't get deallocated within the local scope of a function or get properly disposed when you class gets deallocated frederik jacques - @thenerd_be 38
Disposebags // Somewhere at the top private let disposeBag = DisposeBag() /////// // Somewhere else let nameSubject = ReplaySubject.create(bufferSize: 1) nameSubject.onNext("Frederik") nameSubject.onNext("Steven") nameSubject.subscribe(onNext: { (name) in print("Name = \(name)") }).disposed(by: disposeBag) nameSubject.onNext("Spencer") frederik jacques - @thenerd_be 39
Sharing is caring • Every subscription, triggers the observable • Share an observable to avoid this (e.g. network requests) • share() • share(replay: 1, scope: .forever) • share(replay: 1, scope: .whileConnected) frederik jacques - @thenerd_be 41
Map • Map from one thing to something else Observable.just( 18 ) .map { (age) -> String in guard age > 16 else { return "Not allowed to drink" } return "Allowed to drink" } frederik jacques - @thenerd_be 46
Distinct • Only allow unique elements in the stream • Use distinctUntilChanged if doubles are allowed, but not one after each other frederik jacques - @thenerd_be 49
Schedulers • Have nothing to do with threading • A context where a process takes place (can be a thread, dispatch_queue, NSOperation, ...). frederik jacques - @thenerd_be 57
Great resources • Slack Channel • RxSwift Book (Ray Wenderlich) • Marin Todorov's blog • Droids on roids blog • Rx.playground (in RxSwift GitHub repo) frederik jacques - @thenerd_be 62