viper: наш взгляд на вопрос. ua mobile 2016

45
ȿɤɚɬɟɪɢɧɚ Ʉɨɪɨɜɤɢɧɚ ɂɧɠɟɧɟɪ-ɪɚɡɪɚɛɨɬɱɢɤ ТOS ɧɚɲ ɜɡɝɥɹɞ ɧɚ ɜɨɩɪɨɫ Ⱥɪɯɢɬɟɤɬɭɪɚ VIPER

Upload: ua-mobile

Post on 07-Apr-2017

238 views

Category:

Software


0 download

TRANSCRIPT

Page 1: VIPER: наш взгляд на вопрос. UA Mobile 2016

- ТOS

VIPER

Page 2: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Page 3: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

• TDD

• Code review

• ???

Page 4: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

MVC

Controller

Model View

Page 5: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

MVVM

ViewController ViewModel Model

Page 6: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter Data Store

(Entity) View Interactor

VIPER

Router

Page 7: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Ч « »?

Page 8: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Ч « »?

Page 9: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Ч « »?

Page 10: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

class,

NSObject UIViewController

class,

NSObject

class,

NSObject

NSManagedObject

NSObject,

struct

View Presenter Interactor Data Store

(Entity)

Router

VIPER

Page 11: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Page 12: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

class MoviesListModuleInitializer: NSObject {

override func awakeFromNib() {

let configurator = factory.moduleConfigurator()

configurator.configureModule(self.viewController)

}

}

Page 13: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

class MoviesListModuleConfigurator {

func configureModule(viewController: ViewController) {

let presenter = Presenter()

let service = ServiceDefault()

viewController.presenter = presenter

presenter.builder = builder

… }

}

Page 14: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

let controller = UIViewController(data: data)

let controller = UIViewController()

controller.data = data

Про е : SОРuО

Page 15: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

prepareForSegue

Page 16: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

class BaseViewController: UIViewController, ModuleDataTransferProtocol {

func performSegueWithIdentifier(identifier: String, configurationBlock: (destination:

ConfigurableController) -> Void) {

}

func prepareForSegue(segue: UIStoryboardSegue,

sender: AnyObject?)

{

var destination = segue.destinationViewController

block(destination: destination)

}

}

Page 17: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

func openMovieWithId(movieId: String) {

controller.performSegueWith(block: {

destinationController in

destinationController.configureModule(movieId)

})

}

Page 18: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

router.openMoviewWithId(id)

vC.pОrПormSОРuОАТtСBloМk(…)

prОpКrОForSОРuО(…)

configurationBlock(destination)

Page 19: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

• NSMКnКРОНOЛjОМt

• SОrvТМО OrТОntОН ArМСТtОМturО (SOA)

• poН’

Page 20: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

VIPER + Swift

Page 21: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Page 22: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

View

protocol MoviesListViewInput: class {

func showData(dataStructure: DataStructure)

func showError(error: NSError)

func showEmptyView()

}

Page 23: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter //

protocol MoviesListViewOutput {

func viewIsReadyToAppear()

func didSelectMovieWithIndex(index: Int)

}

//

protocol MoviesListInteractorOutput: class {

func didObtainMoviesList(movies: [Movie]?)

func didFailToObtainMoviesListWithError(error: NSError)

}

Page 24: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Interactor

//

protocol MoviesListInteractorInput {

func obtainMoviesList()

}

Page 25: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Router

//

protocol MoviesListRouterInput {

func openMovieWithId(movieId: String)

}

Page 26: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

View

Presenter

Interactor

Service

viewIsReadyToAppear()

obtainData()

fetchData()

Page 27: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Service

Interactor

Presenter

completionBlock() Array <Objects>

didObtainData() Array <Objects>

Page 28: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter

View

showData()

Page 29: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Service

Interactor

Presenter

View

completionBlock() Error

didFailWithError()

showError()

Page 30: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

VIPER + Swift

Page 31: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

View protocol WriteUsViewInput: class {

func showEmailError()

func clearInputViews()

func showSpinner()

func hideSpinner()

}

Page 32: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter protocol WriteUsOutput: class {

func userRequestToWriteUs(withName name: String,

email: String,

message: String)

func userWantsToGoBack(areFieldsEmpty: Bool)

}

protocol WriteUsInteractorOutput: class {

func didSendFeedbackMessage()

func didFailToSendFeedbackMessage(error: NSError)

}

Page 33: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Interactor

protocol WriteUsInteractorInput {

func isValidEmail(email: String) -> Bool

func sendMessage(fromAuthor username: String,

email: String,

message: String)

}

Page 34: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Router protocol WriteUsRouterInput: class {

func goBackFromViewController(viewController: UIViewController)

func showAlertExitSubmitAlert(actionHandler: AlertActionsHandler)

func showAlertFeedbackSendDidSucceed()

func showAlertFeedbackSendDidFail()

}

Page 35: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

View

Presenter

Interactor

userRequestToWriteUs()

isValidEmail()

Page 36: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter

Interactor

Service

sendMessage()

sendMessage()

Page 37: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter

Router

showFeedbackSucceed()

Page 38: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Presenter

View

showEmailError()

Page 39: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Ч

Presenter Service View Interactor

Router Local

storage

Network

client

Page 40: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

• /

Page 41: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

• Х « - ?»

Page 42: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

VIPER?

///

class AboutViewController: UIViewController {

//

@IBOutlet weak var versionLabel: UILabel!

override func viewDidLoad() {

super.viewDidLoad()

let versionNumber =

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShort

VersionString")

let buildNumber =

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersi

on")

versionLabel.text = " \(versionNumber!)

(\(buildNumber!))"

}

/**

ТTunОs

*/

@IBAction func openAppstore(sender: AnyObject) {

UIApplication.sharedApplication().openURL(NSURL(string:

"https://itunes.apple.com/ru/app/lenta.ru-vse-novosti-dna-

politika/id975805914?mt=8")!)

}

}

Page 43: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

• / /

• , MVP

Page 44: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

Open Source

• . —

• Generamba —

• VIPER McFlurry —

• The Book of VIPER —

https://github.com/rambler-ios

Page 45: VIPER: наш взгляд на вопрос. UA Mobile 2016

VIPER.

THANKS!