reactivecocoa - tdc 2016

54
REACTIVE COCOA Trilha iOS Carlos Vinícius Real Guilherme Endres Software Engineer Software Engineer

Upload: carlos

Post on 09-Jan-2017

113 views

Category:

Mobile


0 download

TRANSCRIPT

Page 1: ReactiveCocoa - TDC 2016

REACTIVE COCOATrilha iOS

Carlos Vinícius Real Guilherme EndresSoftware Engineer Software Engineer

Page 2: ReactiveCocoa - TDC 2016

ReactiveCocoa?

Page 3: ReactiveCocoa - TDC 2016

ISSO NÃO VAI DAR CERTO…

Page 4: ReactiveCocoa - TDC 2016

RAC

IOS

Page 5: ReactiveCocoa - TDC 2016

ReactiveCocoa?

Page 6: ReactiveCocoa - TDC 2016
Page 7: ReactiveCocoa - TDC 2016

Functional Reactive Programming

Reactive Cocoa

Page 8: ReactiveCocoa - TDC 2016

Reactive Programming +

Functional Programming

Reactive Cocoa

Page 9: ReactiveCocoa - TDC 2016

Reactive Programming +

Functional Programming

Reactive Cocoa

Page 10: ReactiveCocoa - TDC 2016

Reactive Programming

Page 11: ReactiveCocoa - TDC 2016

Reactive Programming +

Functional Programming

Reactive Cocoa

Page 12: ReactiveCocoa - TDC 2016

Functional Programming

Imperativo vs Declarativo

Page 13: ReactiveCocoa - TDC 2016

FRP | Imperativo

Como

var strongBeers = [Beer]();

for beer in beers {

if beer.alcohoolPercent > 6 {

strongBeers.append(beer)

}

}

Page 14: ReactiveCocoa - TDC 2016

FRP | Declarativo

O que

beers.filter{ $0.alcohoolPercent > 6 }

Page 15: ReactiveCocoa - TDC 2016

SIGNALS &

SIGNALS PRODUCERS

Page 16: ReactiveCocoa - TDC 2016

Weiss

map

filter

RedAle

Page 17: ReactiveCocoa - TDC 2016

http://neilpa.me/rac-marbles

Page 18: ReactiveCocoa - TDC 2016

EVENTS

Page 19: ReactiveCocoa - TDC 2016

Events

Next

Completed

Failed

Interrupted

Page 20: ReactiveCocoa - TDC 2016

CallBack blocks

KVO

Actions

Delegate

NSNOTIFICATION

Page 21: ReactiveCocoa - TDC 2016

CODE

Page 22: ReactiveCocoa - TDC 2016

CODE

Swift

ReactiveCocoa4

MVVM

Page 23: ReactiveCocoa - TDC 2016
Page 24: ReactiveCocoa - TDC 2016

BUTTON SIGNAL

Page 25: ReactiveCocoa - TDC 2016

let buttonSignal: RACSignal = enterButton.rac_signalForControlEvents( UIControlEvents.TouchUpInside)

USERVIEWCONTROLLER | BUTTON SIGNAL

Page 26: ReactiveCocoa - TDC 2016

let buttonSignal: RACSignal = enterButton.rac_signalForControlEvents( UIControlEvents.TouchUpInside)

let buttonSignalProducer: SignalProducer = buttonSignal .toSignalProducer() .observeOn(UIScheduler())

USERVIEWCONTROLLER | BUTTON SIGNAL PRODUCER

Page 27: ReactiveCocoa - TDC 2016

OPERATORS

Page 28: ReactiveCocoa - TDC 2016

buttonSignalProducer

.flatMap(

transform:)

USERVIEWCONTROLLER | OPERATORS

Page 29: ReactiveCocoa - TDC 2016

buttonSignalProducer

.flatMap(FlattenStrategy.Latest,

transform: userViewModel.saveUser)

USERVIEWCONTROLLER | OPERATORS

Page 30: ReactiveCocoa - TDC 2016

buttonSignalProducer

.flatMap(FlattenStrategy.Latest,

transform: userViewModel.saveUser)

.startWithNext { username in

self.performSegueWithIdentifier("beerControllerSegue", sender: self)

}

USERVIEWCONTROLLER | OPERATORS

Page 31: ReactiveCocoa - TDC 2016

MUTABLE PROPERTY

Page 32: ReactiveCocoa - TDC 2016

var quantity = MutableProperty<Int>(0)

var userImage = MutableProperty<UIImage?>.init(defaultImage)

BEERVIEWMODEL | MUTABLE PROPERTIES

Page 33: ReactiveCocoa - TDC 2016

BINDING<~

Page 34: ReactiveCocoa - TDC 2016

beerViewModel.quantity <~ beerQuantityProducer

BEERVIEWCONTROLLER | BINDING

Page 35: ReactiveCocoa - TDC 2016

MÉTODOS

Page 36: ReactiveCocoa - TDC 2016

func imageForBeer(quantity: Int) -> SignalProducer<UIImage?, NoError> {

}

BEERVIEWMODEL | MÉTODOS

Page 37: ReactiveCocoa - TDC 2016

func imageForBeer(quantity: Int) -> SignalProducer<UIImage?, NoError> { return SignalProducer { observe, disposable in

}.delay(1, onScheduler: QueueScheduler.mainQueueScheduler) }

BEERVIEWMODEL | MÉTODOS

Page 38: ReactiveCocoa - TDC 2016

func imageForBeer(quantity: Int) -> SignalProducer<UIImage?, NoError> { return SignalProducer { observe, disposable in guard let image: UIImage = imageForQuantity(quantity) else { print("Failed to get image for quantity \(quantity)") return }

}.delay(1, onScheduler: QueueScheduler.mainQueueScheduler) }

BEERVIEWMODEL | MÉTODOS

Page 39: ReactiveCocoa - TDC 2016

func imageForBeer(quantity: Int) -> SignalProducer<UIImage?, NoError> { return SignalProducer { observe, disposable in guard let image: UIImage = imageForQuantity(quantity) else { print("Failed to get image for quantity \(quantity)") return } observe.sendNext(image) }.delay(1, onScheduler: QueueScheduler.mainQueueScheduler) }

BEERVIEWMODEL | MÉTODOS

Page 40: ReactiveCocoa - TDC 2016

userImage <~ quantity.producer

BEERVIEWMODEL | BINDING

Page 41: ReactiveCocoa - TDC 2016

userImage <~ quantity.producer .skipRepeats()

BEERVIEWMODEL | BINDING

Page 42: ReactiveCocoa - TDC 2016

userImage <~ quantity.producer .skipRepeats() .flatMap(FlattenStrategy.Latest, transform: imageForBeer)

BEERVIEWMODEL | BINDING

Page 43: ReactiveCocoa - TDC 2016

personDrunkImage.rac_image <~ beerViewModel.userImage

BEERVIEWCONTROLLER | BINDING

Page 44: ReactiveCocoa - TDC 2016

UNIT TEST

Page 45: ReactiveCocoa - TDC 2016

let userViewModel: UserViewModel = UserViewModel()

UNIT TEST | SUCESSO

Page 46: ReactiveCocoa - TDC 2016

let userViewModel: UserViewModel = UserViewModel()

userViewModel.username.value = "Skywalker"

UNIT TEST | SUCESSO

Page 47: ReactiveCocoa - TDC 2016

let userViewModel: UserViewModel = UserViewModel()

userViewModel.username.value = "Skywalker"

userViewModel.saveUser().on( ).start()

UNIT TEST | SUCESSO

Page 48: ReactiveCocoa - TDC 2016

let userViewModel: UserViewModel = UserViewModel()

userViewModel.username.value = "Skywalker"

userViewModel.saveUser().on( completed: { successExpectation.fulfill() }, failed: { error in XCTFail() }).start()

UNIT TEST | SUCESSO

Page 49: ReactiveCocoa - TDC 2016

let userViewModel: UserViewModel = UserViewModel()

userViewModel.username.value = "Darth Vader"

userViewModel.saveUser().on( completed: {

XCTFail() }, failed: { error in successExpectation.fulfill() }).start()

UNIT TEST | FALHA

Page 50: ReactiveCocoa - TDC 2016

PROBLEMAS

Page 51: ReactiveCocoa - TDC 2016
Page 52: ReactiveCocoa - TDC 2016

https://github.com/username/project

Signals

Signal Producer

Map

Functional programming

"Se liga no mestiço, na batida do cavaco"?

Reactive

Reduce

Page 53: ReactiveCocoa - TDC 2016

Links úteis | Reactive Cocoa

http://reactivecocoa.io/philosophy.html

https://github.com/ReactiveCocoa/ReactiveCocoa

http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-

introduction/

https://nomothetis.svbtle.com/an-introduction-to-reactivecocoa

http://neilpa.me/rac-marbles

Page 54: ReactiveCocoa - TDC 2016

https://github.com/gfendres/ractdc2016

[email protected]

Carlos Vinícius Real Guilherme [email protected]