SlideShare a Scribd company logo
REACTIVE THINKING IN IOS
DEVELOPMENT@PEPIBUMUR / @SAKY
WHO?
@pepibumur
iOS Developer at SoundCloud
GitHub: pepibumur
Twitter: pepibumur
@saky
iOS Developer at Letgo
GitHub: isaacroldan
Twitter: saky
GitDo.io our spare time project
INDEX
> Programming Paradigms
> Reactive Libraries
> Reactive Motivation
> Reactive Thinking
> Reactive Caveats
> Conclusion
PARADIGMS !WAYS OF SEEING THE WORLD WHEN IT COMES TO PROGRAMMING
WIKIPEDIA
Data-Driven, Declarative, Dynamic, End-User, Event-Driven,
Expression-Oriented, Feature-Oriented, Function-level,
Generic, Imperative, Inductive, Language Oriented,
Metaprogramming, Non-Structured, Nondeterministic,
Parallel computing, Point-free Style, Structured, Value-
Level, Probabilistic
IMPERATIVE PROGRAMMING
DECLARATIVE PROGRAMMING
IMPERATIVE PROGRAMMING
DECLARATIVE PROGRAMMING
HOW
SEQUENCE OF STEPS
THAT HAPPEN IN ORDER
NATURAL WAY TO
PROGRAM
EXECUTION STATE(AKA SIDE EFFECT)
IMPERATIVE PROGRAMMING
func userDidSearch(term: String) {
let apiReults = api.search(term: term).execute()
self.items = self.adaptResults(apiResults)
self.tableView.reloadData()
}
IMPERATIVE PROGRAMMING
DECLARATIVE PROGRAMMING
WHAT
IT DOESN'T DESCRIBE THE
CONTROL FLOW
HTML
HTML
SQL
HTML
SQL
REACTIVE PROGRAMMING
DECLARATIVE PROGRAMMING
let predicate = NSPredicate(format: "name == %@", "Pedro")
let regex = NSRegularExpression(pattern: ".+", options: 0)
REACTIVE PROGRAMMING
DATA-FLOW PROGRAMMING
(DESCRIBES THE STATE PROPAGATION)
# THE INTRODUCTION TO REACTIVE PROGRAMMING THAT YOU'VE BEEN MISSING
FUNCTIONAL REACTIVE
PROGRAMMING
(AKA FRP)
REACTIVE LIBRARIES
> RxSwift (ReactiveX)
> ReactiveCocoa
> BrightFutures
> ReactKit
> Bond
> More and more... PromiseKit, Bolts...
WHAT LIBRARY SHOULD I USE? !
WHAT LIBRARY SHOULD I USE? !
DO I NEED A LIBRARY FOR THIS? !
SWIFT
var userName: String {
didSet {
// React to changes in variables
}
}
SWIFT
var userName: String {
didSet {
// React to changes in variables
view.updateTitle(userName)
}
}
MOTIVATION !WHY SHOULD I STICK TO REACTIVE PROGRAMMING?
> Bindings
> Composability
> Threading
> Bindings
> Composability
> Threading
BINDING
UI BINDING
UI BINDING
UI BINDING
> Bindings
> Composability
> Threading
Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016
Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016
> Bindings
> Composability
> Threading
> Bindings
> Composability
> Threading (observer and execution)
THREADING
REACTIVE THINKING !
THINKING IN TERMS OF
OBSERVABLESOR SIGNALS/PRODUCERS IN REACTIVECOCOA
ACTIONS CAN BE
OBSERVEDHOW? !
.NEXT(T)
.ERROR(ERRORTYPE)
.COMPLETE
OPERATIONS
RxSwift
Observable<String>.create { (observer) -> Disposable in
observer.onNext("next value")
observer.onCompleted()
return NopDisposable.instance // For disposing the action
}
ReactiveCocoa
SignalProducer<String>.create { (observer, disposable) in
observer.sendNext("next value")
observer.sendComplete()
}
EXISTING PATTERNSRXSWIFT ▶︎ RXCOCOA (EXTENSIONS)
REACTIVECOCOA ▶︎ DO IT YOURSELF
UIKIT
let button = UIButton()
button.rx_controlEvent(.TouchUpInside)
.subscribeNext { _ in
print("The button was tapped")
}
NOTIFICATIONS
NSNotificationCenter.defaultCenter()
.rx_notification("my_notification", object: nil)
.subscribeNext { notification
// We got a notification
}
DELEGATES
self.tableView.rx_delegate // DelegateProxy
.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAtIndexPath:)))
.subscribeNext { (parameters) in
// User did select cell at index path
}
PLAYING !WITH OBSERVABLES
OBSERVABLE
let tracksFetcher = api.fetchTracks // Background
.asObservable()
ERROR HANDLING
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
MAPPING
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
FILTERING
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
.filter { $0.name.contains(query) }
FLATMAPPING
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
.filter { $0.name.contains(query) }
.flatMap { self.rx_trackImage(track: $0) }
OBSERVATION THREAD
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
.filter { $0.name.contains(query) }
.flatMap { self.rx_trackImage(track: $0) }
.observeOn(MainScheduler.instance) // Main thread
LE IMPERATIVE WAY !"
func fetchTracks(retry retry: Int = 0, retryLimit: Int, query: query, mapper: (AnyObject) -> Track, completion: ([UIImage], Error?) -> ()) {
api.fetchTracksWithCompletion { (json, error) in
if let _ = error where retry < retryLimit {
fetchTracksWithRetry(retry: retry+1, retryLimit: retryLimit, query: query, mapper: mapper, completion: completion)
}
else if let error = error {
completion([], error)
}
else if let json = json {
guard let jsonArray = json as? [AnyObject] else {
completion([], Error.InvalidResponse)
return
}
let mappedTracks = jsonArray.map(mapper)
let filteredTracks = mappedTracks.filter { $0.name.contains(query) }
self.fetchImages(track: filteredTracks, completion: ([]))
let trackImages = self.fetchImages(tracks: filteredTracks, completion: { (images, error) in
dispatch_async(dispatch_get_main_queue(),{
if let error = error {
completion([], error)
return
}
completion(images, error)
})
})
}
}
}
THROTTLING
CLASSIC REACTIVE EXAMPLE
func tracksFetcher(query: String) -> Observable<[TrackEntity]>
searchTextField
.rx_text.throttle(0.5, scheduler: MainScheduler.instance)
.flatmap(tracksFetcher)
.subscribeNext { tracks in
// Yai! Tracks searched
}
OTHER OPERATORS
Combining / Skipping Values / Deferring / Concatenation /
Take some values / Zipping
OBSERVING !EVENTS
SUBSCRIBING
observable
subscribe { event
switch (event) {
case .Next(let value):
print(value)
case .Completed:
print("completed")
case .Error(let error):
print("Error: (error)")
}
}
BIND CHANGES OVER THE
TIME TO AN OBSERVABLEOBSERVABLE ▶ BINDING ▶ OBSERVER
BINDING
To a Variable
let myVariable: Variable<String> = Variable("")
observable
.bindTo(myVariable)
print(myVariable.value)
To UI
observable
.bindTo(label.rx_text)
Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016
! CAVEATSBECAUSE YES...
IT COULDN'T BE PERFECT
DEBUGGINGDEBUG OPERATOR IN RXSWIFT
let tracksFetcher = api.fetchTracks // Background
.asObservable()
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
.filter { $0.name.contains(query) }
.flatMap { self.rx_trackImage(track: $0) }
.observeOn(MainScheduler.instance) // Main thread
let tracksFetcher = api.fetchTracks // Background
.asObservable
.debug("after_fetch") // <-- Debugging probes
.retry(3)
.catchErrorJustReturn([])
.map(TrackEntity.mapper().map)
.debug("mapped_results") // <-- Debugging probes
.filter { $0.name.contains(query) }
.flatMap { self.rx_trackImage(track: $0) }
.observeOn(MainScheduler.instance) // Main thread
//let tracksFetcher = api.fetchTracks // Background
// .asObservable
.debug("after_fetch") // <-- Debugging probes
// .retry(3)
// .catchErrorJustReturn([])
// .map(TrackEntity.mapper().map)
.debug("mapped_results") // <-- Debugging probes
// .filter { $0.name.contains(query) }
// .flatMap { self.rx_trackImage(track: $0) }
// .observeOn(MainScheduler.instance) // Main thread
> [after_fetch] Next Event... // Downloaded tracks
> [mapped_results] Error ... // Detected error after mapping
> [...]
RETAIN CYCLES
class IssuePresenter {
var disposable: Disposable
func fetch() {
self.disposable = issueTitle
.observable()
.bindTo { self.titleLabel.rx_text }
}
}
UNSUBSCRIPTION
YOU NEED TO TAKE CARE OF THE
LIFECYCLE OF YOUR OBSERVABLES
UNSUBSCRIPTION
title.asObservable().bindTo(field.rx_text)
// RxSwift will show a warning
UNSUBSCRIPTION
let titleDisposable = title.asObservable().bindTo(field.rx_text)
titleDisposable.dispose()
UNSUBSCRIPTION
let disposeBag = DisposeBag()
title.asObservable()
.bindTo(field.rx_text)
.addDisposableTo(disposeBag)
// The binding is active until the disposeBag is deallocated
CONCLUSIONS
PREVENTS STATEFUL
CODE
DATA FLOW MANIPULATION
BECOMES EASIER
BUT... !
YOU COUPLE YOUR
PROJECT TO A LIBRARY
!
REACTIVE CODE SPREADS
LIKE A VIRUS !OVERREACTIVE ⚠
DEFINE REACTIVE DESIGN
GUIDELINES AND STICK TO
THEM
HAVE REACTIVE FUN !
REFERENCES
> rxmarbles.com
> RxSwift Community
> RxSwift Repository
> ReactiveCocoa
WE ARE HIRINGPEPI@SOUNDCLOUD.COM - ISAAC@LETGO.COM
❄ BERLIN - BARCELONA !
Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016
THANKSQUESTIONS?
SLIDES HTTP://BIT.LY/1RFWLCI
@SAKY - @PEPIBUMUR

More Related Content

PPTX
Leveraging jQuery's Special Events API (JSConf 2012)
PDF
Workshop 5: JavaScript testing
PDF
Workshop 23: ReactJS, React & Redux testing
PPTX
React native tour
PDF
Intro to Reactive Programming with Swift
PDF
Présentation de HomeKit
PDF
Inversion Of Control
PDF
Creating Alloy Widgets
Leveraging jQuery's Special Events API (JSConf 2012)
Workshop 5: JavaScript testing
Workshop 23: ReactJS, React & Redux testing
React native tour
Intro to Reactive Programming with Swift
Présentation de HomeKit
Inversion Of Control
Creating Alloy Widgets

What's hot (20)

KEY
There is no spoon - iPhone vs. iPad
PDF
iOS Bluetooth Low Energy (BLE) Remote Robot Interface
PPT
Android wearpp
PDF
Workshop 10: ECMAScript 6
PDF
State management in a GraphQL era
PDF
Ember and containers
PDF
Containers & Dependency in Ember.js
PPTX
Javascript And J Query
PDF
The evolution of redux action creators
PDF
Avinash Kundaliya: Javascript and WordPress
PDF
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
PPTX
Java final project of scientific calcultor
PDF
Intro to node.js web apps
KEY
openFrameworks 007 - events
PDF
Entities on Node.JS
PDF
Javascript: the important bits
PDF
Connecting your phone and home with firebase and android things - James Cogga...
PDF
Complex Architectures in Ember
PDF
What's new in iOS9
PDF
Why react matters
There is no spoon - iPhone vs. iPad
iOS Bluetooth Low Energy (BLE) Remote Robot Interface
Android wearpp
Workshop 10: ECMAScript 6
State management in a GraphQL era
Ember and containers
Containers & Dependency in Ember.js
Javascript And J Query
The evolution of redux action creators
Avinash Kundaliya: Javascript and WordPress
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
Java final project of scientific calcultor
Intro to node.js web apps
openFrameworks 007 - events
Entities on Node.JS
Javascript: the important bits
Connecting your phone and home with firebase and android things - James Cogga...
Complex Architectures in Ember
What's new in iOS9
Why react matters
Ad

Viewers also liked (20)

PDF
Un anno di Front End Meetup! Gioie, dolori e festeggiamenti! - Giacomo Zinett...
PDF
Coding Culture - Sven Peters - Codemotion Milan 2016
PDF
We started with RoR, C++, C#, nodeJS and... at the end we chose GO - Maurizio...
PDF
Graph databases and the Panama Papers - Stefan Armbruster - Codemotion Milan ...
PDF
Getting developers hooked on your API - Nicolas Garnier - Codemotion Amsterda...
PPTX
Impostor syndrome and individual competence - Jessica Rose - Codemotion Amste...
PDF
UGIdotNET Meetup - Andrea Saltarello - Codemotion Milan 2016
PDF
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
PDF
Build Apps for Apple Watch - Francesco Novelli - Codemotion Milan 2016
PPTX
Can Super Coders be a reality? - Atreyam Sharma - Codemotion Milan 2016
PDF
Outthink: machines coping with humans. A journey into the cognitive world - E...
PDF
Bias Driven Development - Mario Fusco - Codemotion Milan 2016
PDF
Higher order infrastructure: from Docker basics to cluster management - Nicol...
PDF
SASI, Cassandra on the full text search ride - DuyHai Doan - Codemotion Milan...
PDF
Angular Rebooted: Components Everywhere - Carlo Bonamico, Sonia Pini - Codemo...
PPTX
Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...
PDF
Il Bot di Codemotion - Emanuele Capparelli - Codemotion Milan 2016
PPTX
Cross-platform Apps using Xamarin and MvvmCross - Martijn van Dijk - Codemoti...
PDF
Large Scale Refactoring at Trivago - Christoph Reinartz - Codemotion Amsterda...
PPTX
Search on the fly: how to lighten your Big Data - Simona Russo, Auro Rolle - ...
Un anno di Front End Meetup! Gioie, dolori e festeggiamenti! - Giacomo Zinett...
Coding Culture - Sven Peters - Codemotion Milan 2016
We started with RoR, C++, C#, nodeJS and... at the end we chose GO - Maurizio...
Graph databases and the Panama Papers - Stefan Armbruster - Codemotion Milan ...
Getting developers hooked on your API - Nicolas Garnier - Codemotion Amsterda...
Impostor syndrome and individual competence - Jessica Rose - Codemotion Amste...
UGIdotNET Meetup - Andrea Saltarello - Codemotion Milan 2016
Living on the Edge (Service): Bundling Microservices to Optimize Consumption ...
Build Apps for Apple Watch - Francesco Novelli - Codemotion Milan 2016
Can Super Coders be a reality? - Atreyam Sharma - Codemotion Milan 2016
Outthink: machines coping with humans. A journey into the cognitive world - E...
Bias Driven Development - Mario Fusco - Codemotion Milan 2016
Higher order infrastructure: from Docker basics to cluster management - Nicol...
SASI, Cassandra on the full text search ride - DuyHai Doan - Codemotion Milan...
Angular Rebooted: Components Everywhere - Carlo Bonamico, Sonia Pini - Codemo...
Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...
Il Bot di Codemotion - Emanuele Capparelli - Codemotion Milan 2016
Cross-platform Apps using Xamarin and MvvmCross - Martijn van Dijk - Codemoti...
Large Scale Refactoring at Trivago - Christoph Reinartz - Codemotion Amsterda...
Search on the fly: how to lighten your Big Data - Simona Russo, Auro Rolle - ...
Ad

Similar to Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016 (20)

PDF
Reactive Programming with RxSwift
PDF
Reactive programming with RxSwift
PDF
RxSwift for Beginners - how to avoid a headache of reactive programming
PDF
RxSwift
PDF
Introduction To Functional Reactive Programming Poznan
PPTX
Rx for Android & iOS by Harin Trivedi
PDF
Swift & ReactiveX – Asynchronous Event-Based Funsies with RxSwift
PDF
Introduction to Functional Reactive Programming
PDF
Prescribing RX Responsibly
PDF
Reactive programming
PDF
Reactive cocoa cocoaheadsbe_2014
PDF
Rx Swift
PDF
Introduction to reactive programming
PDF
RxSwift Training
PDF
Reactive Programming Patterns with RxSwift
PDF
Tech fest
PDF
Hello, ReactorKit 
PDF
Reactive programming with RxSwift
PDF
Code europe
PPTX
Introduction to Reactive programming
Reactive Programming with RxSwift
Reactive programming with RxSwift
RxSwift for Beginners - how to avoid a headache of reactive programming
RxSwift
Introduction To Functional Reactive Programming Poznan
Rx for Android & iOS by Harin Trivedi
Swift & ReactiveX – Asynchronous Event-Based Funsies with RxSwift
Introduction to Functional Reactive Programming
Prescribing RX Responsibly
Reactive programming
Reactive cocoa cocoaheadsbe_2014
Rx Swift
Introduction to reactive programming
RxSwift Training
Reactive Programming Patterns with RxSwift
Tech fest
Hello, ReactorKit 
Reactive programming with RxSwift
Code europe
Introduction to Reactive programming

More from Codemotion (20)

PDF
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
PDF
Pompili - From hero to_zero: The FatalNoise neverending story
PPTX
Pastore - Commodore 65 - La storia
PPTX
Pennisi - Essere Richard Altwasser
PPTX
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
PPTX
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
PPTX
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
PPTX
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
PDF
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
PDF
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
PDF
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
PDF
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
PDF
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
PDF
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
PPTX
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
PPTX
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
PDF
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
PDF
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
PDF
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
PDF
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Pompili - From hero to_zero: The FatalNoise neverending story
Pastore - Commodore 65 - La storia
Pennisi - Essere Richard Altwasser
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019

Recently uploaded (20)

PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
cuic standard and advanced reporting.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Electronic commerce courselecture one. Pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
Review of recent advances in non-invasive hemoglobin estimation
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Per capita expenditure prediction using model stacking based on satellite ima...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
NewMind AI Monthly Chronicles - July 2025
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Modernizing your data center with Dell and AMD
cuic standard and advanced reporting.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Network Security Unit 5.pdf for BCA BBA.
“AI and Expert System Decision Support & Business Intelligence Systems”
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Digital-Transformation-Roadmap-for-Companies.pptx
Machine learning based COVID-19 study performance prediction
Electronic commerce courselecture one. Pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Diabetes mellitus diagnosis method based random forest with bat algorithm

Reactive Thinking in iOS Development - Pedro Piñera Buendía - Codemotion Amsterdam 2016