SlideShare a Scribd company logo
Clean
architecture in
iOS apps
Leonard Beus #fivenyc01.07.2015.
Sadržaj
2
• Najčešći problemi u arhitekturi iOS aplikacija
• Arhitektura zasnovana na use caseovima
• VIPER
• Zaključak
3
Najčešći problemi u arhitekturi iOS
aplikacija
• Masivni kontroleri
• Kontrolerima je pridjeljeno previše
odgovornosti
• MVC (logika za koju nije očito kamo pripada
završi uglavnom u kontroleru)
Arhitektura zasnovana na use caseovima
• Svaki use case ima svoj modul
• Moduli imaju jasno definiranu strukturu (VIPER)
• Standarni komunikacijski obrasci (delegacija,
notifikacije …)
4
5
Arhitektura zasnovana na use caseovima
protocol LoginModuleInterface {
func loginWithUsername(username:String, password:String)
func signUpWithUsername(username:String, password:String)
}
VIPER
6
View Presenter
Router
Interactor
Entity
Entity
Data
store
REST
client
Interactor
7
• Sadržava poslovnu logiku
• Trebao bi biti neovisan o UI-u
• Manipulira domenskim objektima kako bi izvršio
određeni zadatak
8
Interactor
protocol LoginInteractorInput {
func loginWithUsername(username:String, password:String)
func isValidSignUpInput(input:[NSObject : AnyObject]) -> Bool;
}
protocol LoginInteractorOutput {
func didLoginWithUser(user:User)
}
Entity
• Domenski objekti
• Samo interaktor može manipulirati domenskim
objektima
• Domenski objekti se ne bi trebali prosljeđivati
presenteru
9
Presenter
10
• Zna kada treba prikazati korisničko sučelje
• Priprema podatke za prikaz na UI
• Prima inpute iz UI-a
• Mediator između view-a i interaktora
11
Presenter
class LoginPresenter: NSObject, LoginModuleInterface, LoginInteractorOutput {
var rootRouter: RootRouter?
var userInterface: LoginViewInterface?
var loginInteractor: LoginInteractor?
…
}
View
! Trebao bi biti glup i pasivan
! Nikada ne traži podatke od Presentera
! Presenter mu prosljeđuje podatke preko jasno
definiranog sučelja
12
13
View
protocol LoginViewInterface {
func showErrorWithTitle(title:String, message:String)
func setUsername(username:String)
}
Router
! Zna kako treba prikazati korisničko sučelje
! Radi s objektima tipa UIWindow,
UINavigationController, UIViewController
14
15
Router
class LoginRouter: NSObject {
var loginViewController: LoginViewController?
func presentLoginInterfaceFromWindow(window: UIWindow) {
window.rootViewController = loginViewController;
window.makeKeyAndVisible();
}
}
Zaključak
! Jasna struktura projekta
! Jednostavno testiranje
! Komponente poštuju načelo jedinstvene
odgovornosti
! Injekcija ovisnosti
16
http://five.agency/about/careers/
17
HVALA!
18

More Related Content

Viewers also liked

Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
Hendy Christianto
 
Lightning Talk - Clean Architecture and Design
Lightning Talk - Clean Architecture and DesignLightning Talk - Clean Architecture and Design
Lightning Talk - Clean Architecture and Design
Deivison Sporteman
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
Krzysztof Profic
 
iOS viper presentation
iOS viper presentationiOS viper presentation
iOS viper presentation
Rajat Datta
 
VIPER - Design Pattern
VIPER - Design PatternVIPER - Design Pattern
VIPER - Design Pattern
Pedro Henrique Peralta
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
Roc Boronat
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
RAMBLER&Co
 
Clean architecture
Clean architectureClean architecture
Clean architecture
andbed
 
iOS Coding Best Practices
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best Practices
Jean-Luc David
 

Viewers also liked (9)

Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
 
Lightning Talk - Clean Architecture and Design
Lightning Talk - Clean Architecture and DesignLightning Talk - Clean Architecture and Design
Lightning Talk - Clean Architecture and Design
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 
iOS viper presentation
iOS viper presentationiOS viper presentation
iOS viper presentation
 
VIPER - Design Pattern
VIPER - Design PatternVIPER - Design Pattern
VIPER - Design Pattern
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
iOS Coding Best Practices
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best Practices
 

Similar to iOS Zagreb Meetup #02 - Clean architecture in iOS apps (Leonard Beus @ Five)

Decouple Goals
Decouple GoalsDecouple Goals
Decouple Goals
Sasa Blagojevic
 
Projektovanje web aplikacija
Projektovanje web aplikacijaProjektovanje web aplikacija
Projektovanje web aplikacija
Damjan Pavlica
 
VET4SBO Level 2 module 6 - unit 3 - v0.9 srb
VET4SBO Level 2   module 6 - unit 3 - v0.9 srbVET4SBO Level 2   module 6 - unit 3 - v0.9 srb
VET4SBO Level 2 module 6 - unit 3 - v0.9 srb
Karel Van Isacker
 
PHP za pocetnike - predavanje 11
PHP za pocetnike - predavanje 11PHP za pocetnike - predavanje 11
PHP za pocetnike - predavanje 11
Nermin Sehic
 
Napredne tehnike razvoja web aplikacija - Zend Framework
Napredne tehnike razvoja web aplikacija - Zend FrameworkNapredne tehnike razvoja web aplikacija - Zend Framework
Napredne tehnike razvoja web aplikacija - Zend FrameworkSaša Stamenković
 
Android vs iOS development
Android vs iOS developmentAndroid vs iOS development
Android vs iOS development
Vuk Nikolić
 
.NET Core - Sve što trebate znati
.NET Core - Sve što trebate znati.NET Core - Sve što trebate znati
.NET Core - Sve što trebate znati
Axilis
 
SPUG Srbija - Sinergija portal ispod haube - Damjan Tomić
SPUG Srbija - Sinergija portal ispod haube - Damjan TomićSPUG Srbija - Sinergija portal ispod haube - Damjan Tomić
SPUG Srbija - Sinergija portal ispod haube - Damjan TomićSharePoint User Grupa Srbija
 
IoT-Internet-of-Things-servisi-u-Azure-u.pptx
IoT-Internet-of-Things-servisi-u-Azure-u.pptxIoT-Internet-of-Things-servisi-u-Azure-u.pptx
IoT-Internet-of-Things-servisi-u-Azure-u.pptx
kupisajtrs
 
VET4SBO Level 1 module 4 - unit 1 - v0.9 srb
VET4SBO Level 1   module 4 - unit 1 - v0.9 srbVET4SBO Level 1   module 4 - unit 1 - v0.9 srb
VET4SBO Level 1 module 4 - unit 1 - v0.9 srb
Karel Van Isacker
 
VET4SBO Level 1 module 3 - unit 1 - v0.9 srb
VET4SBO Level 1   module 3 - unit 1 - v0.9 srbVET4SBO Level 1   module 3 - unit 1 - v0.9 srb
VET4SBO Level 1 module 3 - unit 1 - v0.9 srb
Karel Van Isacker
 

Similar to iOS Zagreb Meetup #02 - Clean architecture in iOS apps (Leonard Beus @ Five) (12)

Decouple Goals
Decouple GoalsDecouple Goals
Decouple Goals
 
Projektovanje web aplikacija
Projektovanje web aplikacijaProjektovanje web aplikacija
Projektovanje web aplikacija
 
VET4SBO Level 2 module 6 - unit 3 - v0.9 srb
VET4SBO Level 2   module 6 - unit 3 - v0.9 srbVET4SBO Level 2   module 6 - unit 3 - v0.9 srb
VET4SBO Level 2 module 6 - unit 3 - v0.9 srb
 
PHP za pocetnike - predavanje 11
PHP za pocetnike - predavanje 11PHP za pocetnike - predavanje 11
PHP za pocetnike - predavanje 11
 
Napredne tehnike razvoja web aplikacija - Zend Framework
Napredne tehnike razvoja web aplikacija - Zend FrameworkNapredne tehnike razvoja web aplikacija - Zend Framework
Napredne tehnike razvoja web aplikacija - Zend Framework
 
Android vs iOS development
Android vs iOS developmentAndroid vs iOS development
Android vs iOS development
 
.NET Core - Sve što trebate znati
.NET Core - Sve što trebate znati.NET Core - Sve što trebate znati
.NET Core - Sve što trebate znati
 
Java
JavaJava
Java
 
SPUG Srbija - Sinergija portal ispod haube - Damjan Tomić
SPUG Srbija - Sinergija portal ispod haube - Damjan TomićSPUG Srbija - Sinergija portal ispod haube - Damjan Tomić
SPUG Srbija - Sinergija portal ispod haube - Damjan Tomić
 
IoT-Internet-of-Things-servisi-u-Azure-u.pptx
IoT-Internet-of-Things-servisi-u-Azure-u.pptxIoT-Internet-of-Things-servisi-u-Azure-u.pptx
IoT-Internet-of-Things-servisi-u-Azure-u.pptx
 
VET4SBO Level 1 module 4 - unit 1 - v0.9 srb
VET4SBO Level 1   module 4 - unit 1 - v0.9 srbVET4SBO Level 1   module 4 - unit 1 - v0.9 srb
VET4SBO Level 1 module 4 - unit 1 - v0.9 srb
 
VET4SBO Level 1 module 3 - unit 1 - v0.9 srb
VET4SBO Level 1   module 3 - unit 1 - v0.9 srbVET4SBO Level 1   module 3 - unit 1 - v0.9 srb
VET4SBO Level 1 module 3 - unit 1 - v0.9 srb
 

More from Infinum

Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum
 
Infinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtilInfinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtil
Infinum
 
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum
 
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum
 
Infinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelperInfinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelper
Infinum
 
Infinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4jInfinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4j
Infinum
 
Infinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-awareInfinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-aware
Infinum
 
Infinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle pluginsInfinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle plugins
Infinum
 
Infinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android APIInfinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android API
Infinum
 
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum
 
Infinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan MarićInfinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum
 
Infinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan MarićInfinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan Marić
Infinum
 
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko PlesacInfinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum
 
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan ĐikićInfinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum
 
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho PolutaInfinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum
 
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan DikicInfinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum
 
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran BurojevicInfinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum
 
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan KustInfinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum
 
Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko PlesacInfinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum
 

More from Infinum (20)

Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
 
Infinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtilInfinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtil
 
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using Kotlin
 
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
 
Infinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelperInfinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelper
 
Infinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4jInfinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4j
 
Infinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-awareInfinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-aware
 
Infinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle pluginsInfinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle plugins
 
Infinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android APIInfinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android API
 
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
 
Infinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan MarićInfinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan Marić
 
Infinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan MarićInfinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan Marić
 
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko PlesacInfinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
 
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan ĐikićInfinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
 
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho PolutaInfinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
 
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan DikicInfinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
 
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran BurojevicInfinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
 
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan KustInfinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
 
Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko PlesacInfinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
 

iOS Zagreb Meetup #02 - Clean architecture in iOS apps (Leonard Beus @ Five)