Slide 1

Slide 1 text

INTRODUCING APPLICATION COORDINATOR ANDREY PANOV /panovdev /andreypanov [email protected]

Slide 2

Slide 2 text

PRESENTATION.START() ▸ navigation flow in the apps ▸ usual way ▸ changes… ▸ coordinators ▸ new way ▸ tips&tricks

Slide 3

Slide 3 text

FLOW…

Slide 4

Slide 4 text

AUTH FLOW AuthController SignUpController TermsController PhoneListController AddPhoneController VerifyPhoneController Complete Request Finish

Slide 5

Slide 5 text

didSelectRowAtIndexPath: func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if { router.openControllerA() } else if { router.openControllerB() } else if { router.openControllerC() } else if { router.openControllerD() } }

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Controller A Controller B Controller C Send [String:AnyObject] String [Options] [String:AnyObject] [String:AnyObject] String

Slide 8

Slide 8 text

prepareForSegue: override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if segue.identifier == "openControllerA"{ let vc = segue.destinationViewController as! ControllerA vc.monkey = } else if segue.identifier == "openControllerB"{ let vc = segue.destinationViewController as! ControllerB vc.tiger = } else if segue.identifier == "openControllerC"{ let vc = segue.destinationViewController as! ControllerC vc.frog = } else if segue.identifier == "openControllerD"{ let vc = segue.destinationViewController as! ControllerD vc.snake = } }

Slide 9

Slide 9 text

SIGNUP&AUTH FLOW (SERVICES)

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

COORDINATOR?.START() ▸ hard to reuse ▸ every controller knows about other controllers ▸ hard to change flow ▸ hard to test

Slide 12

Slide 12 text

COORDINATORS

Slide 13

Slide 13 text

«So what is a coordinator? A coordinator is an object that bosses view controllers around. Taking all of the driving logic out of your view controllers, and moving that stuff one layer up is gonna make your life a lot more awesome.» –Soroush Khanlou

Slide 14

Slide 14 text

AUTH FLOW AuthController SignUpController TermsController AuthCoordinator Output Output Output Output Input

Slide 15

Slide 15 text

PHONE FLOW PhoneListController AddPhoneController VerifyPhoneController PhoneCoordinator Output Output Output Output Input

Slide 16

Slide 16 text

OUTPUT PROTOCOL // controller output protocol PhoneListOutput { var selectPhone: (Phone -> ())? { get set } var onVerifyPhone: (Bool -> ())? { get set } } // coordinator output protocol PhoneCoordinatorOutput { var finishFlow: (Phone? -> ())? { get set } }

Slide 17

Slide 17 text

INPUT PROTOCOL // controller output protocol SignUpFlowInput { func conformTermsAgreement(agree: Bool) }

Slide 18

Slide 18 text

onFinish() AuthFlow PhoneFlow start()

Slide 19

Slide 19 text

Controller A Controller B Controller C Send [String: AnyObject] String Coordinator String [String:AnyObject] Storage

Slide 20

Slide 20 text

CONSISTS OF…

Slide 21

Slide 21 text

Coordinator Storage Router CoordinatorsFactory ControllersFactory

Slide 22

Slide 22 text

DEMO.RUN()

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

HOW TO INTEGRATE?

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

COORDINATORS IN PROJECT AuthCoordinator ItemsCoordinator CreateItemCoordinator SettingsCoordinator

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

COORDINATOR.FINISH() ▸ controllers know nothing about other controllers ▸ controllers can be easy integrated in different flows ▸ controllers don’t send data to the others ▸ easy to reuse ▸ simplified testing

Slide 29

Slide 29 text

APPLICATION COORDINATOR PROJECT /AndreyPanov/ApplicationCoordinator

Slide 30

Slide 30 text

Swift 3

Slide 31

Slide 31 text

LINKS Coordinators Redux http://khanlou.com/2015/10/coordinators-redux/ Flow Controllers on iOS for a Better Navigation Control http://albertodebortoli.com/blog/2014/09/03/flow-controllers- on-ios-for-a-better-navigation-control/ Boundaries In Practice https://speakerdeck.com/ayanonagon/shi-jian-de-boundaries Application Controller http://martinfowler.com/eaaCatalog/applicationController.html

Slide 32

Slide 32 text

QUESTIONS?.ASK()