Slide 1

Slide 1 text

ASYNCHRONOUS CODE WITH REACTIVECOCOA 1 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 2

Slide 2 text

PREVIOUSLY, ON SWIFT SUMMIT... 2 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 3

Slide 3 text

FLASHBACK 3 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 4

Slide 4 text

BEFORE func loadAvatar(userID: String, completion: (UIImage?, NSError?) -> ()) { requestUserInfo(userID) { user, error in if let user = user { downloadImage(user.avatarURL) { avatar, error in if let avatar = avatar { completion(avatar, nil) } else { completion(nil, error) } } } else { completion(nil, error) } } } 4 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 5

Slide 5 text

AFTER func requestUserInfo(userID: String) -> Future func downloadImage(URL: NSURL) -> Future func loadAvatar(userID: String) -> Future { return requestUserInfo(userID) .map { $0.avatarURL } .andThen(downloadImage) } 5 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 6

Slide 6 text

WHY? 6 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 7

Slide 7 text

ASYNCHRONY IN MOBILE APPLICATIONS > KVO > User data > Networking > Gesture recognizers > Animations > Sensors > Mutable State > ... 7 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 8

Slide 8 text

8 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 9

Slide 9 text

TL;DR ASYNCHRONOUS CODE IS HARD 9 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 10

Slide 10 text

ASYNCHRONOUS CODE IS HARD > Cancelation > Throttling > Error handling > Retrying > Threading > ... 10 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 11

Slide 11 text

''THERE HAS TO BE A BETTER WAY!'' 11 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 12

Slide 12 text

That perfection is unattainable is no excuse not to strive for it. — Stolen from Nacho's Twitter bio 12 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 13

Slide 13 text

REACTIVECOCOA™ 13 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 14

Slide 14 text

REACTIVECOCOA IS HARD 14 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 15

Slide 15 text

REACTIVECOCOA IS HARD > Syntax is unfamiliar > Foreign concepts > Feels different to traditional Cocoa APIs > Apple's APIs don't use it. 15 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 16

Slide 16 text

REACTIVECOCOA IS SIMPLE1 > Few concepts > Abstract away complexity > One pattern for asynchronous APIs 1 ''Simple made Easy'' - Rich Hickey 16 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 17

Slide 17 text

17 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 18

Slide 18 text

CONCEPTS IN COCOA INVOLVED IN ASYNCHRONOUS APIS > Delegation > NSOperation > NSNotificationCenter > KVO > Target-Action > Responder chain > Callback blocks 18 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 19

Slide 19 text

SIGNALS 19 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 20

Slide 20 text

SIGNALS > Next > Failed > Completed > Interrupted 20 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 21

Slide 21 text

Signal AND SignalProducer 21 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 22

Slide 22 text

Signal VS SignalProducer func doSomethingAndGiveMeTheResult() -> SignalProducer func observeSomeOnGoingWork() -> Signal 22 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 23

Slide 23 text

OPERATORS 23 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 24

Slide 24 text

RAC'S OPERATORS: DECLARATIVE VS IMPERATIVE let array = ["one", "two", "three"] // Imperative var newArray: [String] = [] for string in array { newArray.append(string.uppercaseString) } // Declarative let newArray = array.map { string in return string.uppercaseString } 24 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 25

Slide 25 text

RAC'S OPERATORS: DECLARATIVE VS IMPERATIVE let throttleInterval: NSTimeInterval = 0.5 // Imperative func search(query: String, completion: ([SearchResult]?, MyErrorType?) -> ()) var lastSearch: NSDate? // <--- State func didTypeSearchQuery(searchQuery: String) { guard (lastSearch?.timeIntervalSinceNow > throttleInterval) ?? false else { return } lastSearchDate = NSDate() search(searchQuery) { results, error in ... } } // Declarative let searchQuerySignal: Signal func search(query: String) -> SignalProducer<[SearchResult], MyErrorType> searchQuerySignal.throttle(throttleInterval).flatMap(.Latest, search) 25 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 26

Slide 26 text

OPERATORS > map > filter > reduce > collect > combineLatest > zip > merge / concat / switchToLatest > flatMapError / mapError > retry > throttle 26 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 27

Slide 27 text

KVO 27 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 28

Slide 28 text

KVO > Crash if object deallocates while being observed. > Crash if observe wrong keypath (stringly-typed API) > Possible crash when de-registering > Easy to break parent class (context often misused) > All observations come through one method > Lose contract: "is this KVO-compliant?" 28 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 29

Slide 29 text

PROPERTY 29 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 30

Slide 30 text

PROPERTY // KVO class MyClass { private(set) dynamic var value: Type } let object = MyClass() object.addObserver(self, forKeyPath: "value", options: [], context: ctx) func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [NSObject : AnyObject]?, context: UnsafeMutablePointer) { /* HAVE FUN!! */ } // PropertyType class MyClass { var value: AnyProperty } let object = MyClass() object.value.producer.startWithNext { value in ... } 30 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 31

Slide 31 text

MYTH: "TO USE REACTIVECOCOA, I NEED TO RE-WRITE MY WHOLE APP" 31 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 32

Slide 32 text

CONCLUSIONS > Our tools are imperfect. Strive to reconsider patterns, seek better alternatives. > There's value in these abstractions. > ReactiveCocoa can be adopted slowly. 32 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 33

Slide 33 text

REFERENCES > ReactiveCocoa: https://github.com/ReactiveCocoa/ReactiveCocoa > Back to the Futures - Me: https://realm.io/news/swift-summit- javier-soto-futures > Functional Reactive Programming in an Imperative World - Nacho Soto: https://realm.io/news/ nacho-soto-functional-reactive-programming > "Simple made Easy" - Rich Hickey: http://www.infoq.com/ presentations/Simple-Made-Easy 33 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015

Slide 34

Slide 34 text

THANK YOU! 34 — "Asynchronous Code with ReactiveCocoa" - Javier Soto. March 2015