queue.sync { // Save new state and notify subscribers } } } func fetchProcesses() { state = ProcessListViewState.loading() service.loadProcesses { processes, error in if error { state = ProcessListViewState.error(with: error) } else { state = ProcessListViewState.loaded(with: process) } } } }
queue.sync { // Save new state, log it, serialize it and notify subscribers } } } func fetchProcesses() { state = ProcessListViewState.loading() service.loadProcesses { processes, error in if error { state = ProcessListViewState.error(with: error) } else { state = ProcessListViewState.loaded(with: process) } } } }
queue.sync { // Save new state, log it, serialize it and notify subscribers } } } func fetchProcesses() { state = ProcessListViewState.loading() service.loadProcesses { processes, error in if error { state = ProcessListViewState.error(with: error) } else { state = ProcessListViewState.loaded(with: process) } } } }
class ProcessListViewController { func render(state: ProcessListViewState) { switch state { case .loading: renderLoading() case .loaded(let processes): render(processes) case .error(let error): render(error) } } }
class ProcessListViewController { func render(state: ProcessListViewState) { switch state { case .loading: renderLoading() case .loaded(let processes): render(processes) case .error(let error): render(error) } } }
of the state. • Not persistent data structures. • No guarantee only subclasses can change the state (no protected modifier in swift). • Mutating can be cumbersome with big trees -> leverage composition.
of the state. • Not persistent data structures. • No guarantee only subclasses can change the state (no protected modifier in swift). • Mutating can be cumbersome with sum types -> leverage composition. • Stores interdependencies can lead to infinite loops.