43
App Coordinators

App coordinators in iOS

  • Upload
    uptech

  • View
    128

  • Download
    0

Embed Size (px)

Citation preview

Page 1: App coordinators in iOS

App Coordinators

Page 2: App coordinators in iOS

Overstuffed App Delegate

Page 3: App coordinators in iOS

- (void)setupViewHierarchy { UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController; if ([AppConfig isPaidApp]) { [self removeViewControllerOfType:[RRUnlockViewController class] fromTabBarController:tabBarVC]; } if ([AppConfig isMeditationApp]) { if (![AppConfig isPaidApp]) { [self removeViewControllerOfType:[RRFavoriteViewController class] fromTabBarController:tabBarVC]; } RRSoundsViewController *soundsVC = [[UIStoryboard storyboardWithName:@"Sounds" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"RRSoundsViewController"]; soundsVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Sounds" image:[UIImage imageNamed:@"icon_sounds"] tag:1]; soundsVC.meditationManager = self.meditationManager; UINavigationController *soundsNVC = [[UINavigationController alloc] initWithRootViewController:soundsVC]; RRTimerViewController *timerVC = [[UIStoryboard storyboardWithName:@"Timer" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"RRTimerViewController"]; timerVC.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Timer" image:[UIImage imageNamed:@"icon_timer"] tag:1]; timerVC.timerManager = self.timerManager; UINavigationController *timerNVC = [[UINavigationController alloc] initWithRootViewController:timerVC]; NSMutableArray *allViewControllers = [tabBarVC.viewControllers mutableCopy]; [allViewControllers insertObject:soundsNVC atIndex:0]; [allViewControllers insertObject:timerNVC atIndex:3]; tabBarVC.viewControllers = allViewControllers;

. . .

Page 4: App coordinators in iOS

Too Many Responsibilities

Page 5: App coordinators in iOS

Model Domain State & Behavior

View Controller

Mediates Model-View Interactions

View

Display & Layout

Page 6: App coordinators in iOS

View Controller

Page 7: App coordinators in iOS

Model-View Binding

View Controller

Page 8: App coordinators in iOS

Model-View Binding Subview Allocation

View Controller

Page 9: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Page 10: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout

Page 11: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout Data Transformation

Page 12: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout Data Transformation Navigation Flow

Page 13: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout Data Transformation Navigation Flow

User Input

Page 14: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout Data Transformation Navigation Flow

User Input Model Mutation

Page 15: App coordinators in iOS

Navigation Flow

Page 16: App coordinators in iOS

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let photo = self.data[indexPath.row]

let nextViewController = PhotosViewController(with: photo)

self.navigationController?.pushViewController(nextViewController) }

Page 17: App coordinators in iOS

LoginViewController

PhotosViewController

NewPhotoViewController

SavePhotoViewController

Page 18: App coordinators in iOS

Libraries

Frameworks

Page 19: App coordinators in iOS

Libraries

Frameworks

you call

Page 20: App coordinators in iOS

Libraries

Frameworks

you call

call you

Page 21: App coordinators in iOS

App Coordinatoraka Application Controller, Flow Controller

Page 22: App coordinators in iOS

What does a coordinator do?

Page 23: App coordinators in iOS

Model-View Binding Subview Allocation Data Fetching

View Controller

Layout Data Transformation Navigation Flow

User Input Model Mutation

App Coordinator

View Model

Page 24: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout Data Transformation Navigation Flow

User Input Model Mutation

App Coordinator

View Model

Page 25: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout

Data Transformation Navigation Flow

User Input Model Mutation

App Coordinator

View Model

Page 26: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout

Data Transformation

Navigation Flow

User Input Model Mutation

App Coordinator

View Model

Page 27: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout

Data Transformation

Navigation Flow

User Input Model Mutation

App Coordinator

View Model

Page 28: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout

Data Transformation

Navigation Flow

User Input

Model Mutation

App Coordinator

View Model

Page 29: App coordinators in iOS

Model-View Binding

Subview Allocation

Data Fetching

View Controller

Layout

Data Transformation

Navigation Flow

User Input

Model Mutation

App Coordinator

View Model

Page 30: App coordinators in iOS

How to use coordinators?

Page 31: App coordinators in iOS

let dependencies = Dependencies(api: vidmeApi, persistenceManager: realmDB) appCoordinator = AppCoordinator(window: window!, dependencies: dependencies) appCoordinator.start()

Page 32: App coordinators in iOS

class AppCoordinator: Coordinator { private let window: UIWindow private let dependencies: Dependencies private var childCoordinators = [Coordinator]()

func start() { if isLoggedIn {

showContent() } else { showAuth() }

} }

Page 33: App coordinators in iOS

func showAuth() { let loginCoordinator = LoginCoordinator(navigationController: self.navigationController,

dependencies: self.dependencies)

loginCoordinator.delegate = self

self.childCoordinators.append(loginCoordinator)

loginCoordinator.start() }

Page 34: App coordinators in iOS

class LoginCoordinator: Coordinator {

func start() { let loginViewController = LoginViewController() loginViewController.api = dependencies.api loginViewController.persistenceManager = dependencies.persistenceManager loginViewController.delegate = self navigationController.pushViewController(loginViewController, animated: true)

} func loginViewController(viewController: LoginViewController, didLoginUser user: User) {

delegate?.userDidLogin(user) } }

Page 35: App coordinators in iOS

Why coordinators are great?

Page 36: App coordinators in iOS

1. View Controllers are isolated

Page 37: App coordinators in iOS

A B C D

Page 38: App coordinators in iOS

A B C D

Coordinator

Page 39: App coordinators in iOS

1. View Controllers are isolated

Page 40: App coordinators in iOS

1. View Controllers are isolated

2. View Controllers are reusable

Page 41: App coordinators in iOS

1. View Controllers are isolated

2. View Controllers are reusable

3. Every task is encapsulated

Page 42: App coordinators in iOS

1. View Controllers are isolated

2. View Controllers are reusable

3. Every task is encapsulated

4. Coordinators are fully in our control

Page 43: App coordinators in iOS

Thanks 🌞