Slide 1

Slide 1 text

QPUBUPUJQT 3Y4XJGUͷ%SJWFS .PUPLJ/BSJUB !NP@UP@

Slide 2

Slide 2 text

ࣗݾ঺հ w ੒ాݩًʢͳΓͨ΋ͱ͖ʣ w !NP@UP@ w גࣜձࣾωΫετͰɹɹ)0.&`4ͱ͍͏
 ෆಈ࢈ݕࡧΞϓϦͷJ04ΤϯδχΞΛ΍͍ͬͯ·͢ w ݸਓͰ΋ΧϝϥΞϓϦΛ࡞ͬͨΓ w ࠷ۙ͸3Y4XJGUʹऔΓ૊ΜͰ͍Δ

Slide 3

Slide 3 text

%SJWFSͱ͸ʁ

Slide 4

Slide 4 text

%SJWFSΛ஌Δ w υΩϡϝϯτ͔Β஌Δ w αϯϓϧίʔυ͔Β஌Δ

Slide 5

Slide 5 text

υΩϡϝϯτ͔Β஌Δ

Slide 6

Slide 6 text

%PDVNFOUT6OJUTΛಡΉ w ҎԼʹ6OJUTͷҰͭͱͯ͠ղઆ͞Ε͍ͯΔ w IUUQTHJUIVCDPN3FBDUJWF93Y4XJGUCMPC NBTUFS%PDVNFOUBUJPO6OJUTNE w ೔ຊޠʹ༁͍ͯ͠Δํ͕͍Βͬ͠Ό͍·͢ w IUUQTHJUIVCDPNUJELJKZVO3Y4XJGUCMPC USBOTMBUFTJOUPKBQBOFTF%PDVNFOUBUJPO@KB 6OJUTNE

Slide 7

Slide 7 text

αϯϓϧίʔυ͔Β஌Δ

Slide 8

Slide 8 text

3Y&YBNQMFͷιʔεΛಡΉ w (JU)VC4JHOVQ͕ͦΕ w ύλʔϯ w 6TJOH%SJWFS w 6TJOH7BOJMMB0CTFSWBCMFT w 6*͔Βҧ͍͸෼͔Βͳ͍

Slide 9

Slide 9 text

$PEF3FBEJOH

Slide 10

Slide 10 text

validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .observeOn(MainScheduler.instance) .catchErrorJustReturn(.Failed(message: "Error contacting server")) } .shareReplay(1) %SJWFS͡Όͳ͍ύλʔϯ ೖྗ͞ΕͨϢʔβʔ໊ͷόϦσʔγϣϯΛߦ͍ͬͯΔՕॴ

Slide 11

Slide 11 text

func validateUsername(username: String) -> Observable { if username.characters.count == 0 { return Observable.just(.Empty) } // this obviously won't be if username.rangeOfCharacterFromSet(NSCharacterSet.alphanumericCharacterSet().invertedSet) != nil { return Observable.just(.Failed(message: "Username can only contain numbers or digits")) } let loadingValue = ValidationResult.Validating return API .usernameAvailable(username) .map { available in if available { return .OK(message: "Username available") } else { return .Failed(message: "Username already taken") } } .startWith(loadingValue) }

Slide 12

Slide 12 text

enum ValidationResult { case OK(message: String) case Empty case Validating case Failed(message: String) } 7BMJEBUJPO3FTVMU

Slide 13

Slide 13 text

validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .asDriver(onErrorJustReturn: .Failed(message: "Error contacting server")) } %SJWFSύλʔϯ

Slide 14

Slide 14 text

validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .asDriver(onErrorJustReturn: .Failed(message: "Error contacting server")) } ൺֱ validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .observeOn(MainScheduler.instance) .catchErrorJustReturn(.Failed(message: "Error contacting server")) } .shareReplay(1)

Slide 15

Slide 15 text

validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .asDriver(onErrorJustReturn: .Failed(message: "Error contacting server")) } validatedUsername = input.username .flatMapLatest { username in return validationService.validateUsername(username) .observeOn(MainScheduler.instance) .catchErrorJustReturn(.Failed(message: "Error contacting server")) } .shareReplay(1) ൺֱ

Slide 16

Slide 16 text

όΠϯυ͢Δͱ͖

Slide 17

Slide 17 text

viewModel.validatedUsername .bindTo(usernameValidationOutlet.ex_validationResult) .addDisposableTo(disposeBag) %SJWFS͡Όͳ͍ύλʔϯ

Slide 18

Slide 18 text

viewModel.validatedUsername .drive(usernameValidationOutlet.ex_validationResult) .addDisposableTo(disposeBag) %SJWFSύλʔϯ

Slide 19

Slide 19 text

ൺֱ viewModel.validatedUsername .bindTo(usernameValidationOutlet.ex_validationResult) .addDisposableTo(disposeBag) viewModel.validatedUsername .drive(usernameValidationOutlet.ex_validationResult) .addDisposableTo(disposeBag)

Slide 20

Slide 20 text

CJOE5Pͷํ͸஫ҙ
 Τϥʔͱ͔ϝΠϯεϨουͱ͔

Slide 21

Slide 21 text

%SJWFS͸6*Ͱ࢖͏ͱ͖ʹ஫ҙ ͢Δ͜ͱ͕ߟྀ͞Ε͍ͯΔ

Slide 22

Slide 22 text

͜͜·Ͱͷ·ͱΊ

Slide 23

Slide 23 text

%SJWFSͷಛ௃ w DBOUFSSPSPVU w PCTFSWFPONBJOTDIFEVMFS w TIBSJOHTJEFF⒎FDUT TIBSF3FQMBZ-BUFTU8IJMF$POOFDUFE

Slide 24

Slide 24 text

%SJWFSͷಛ௃͸ҎԼʹॻ͔Ε͍ͯΔ w 6OJUTNE w IUUQTHJUIVCDPN3FBDUJWF93Y4XJGUCMPC NBTUFS%PDVNFOUBUJPO6OJUTNE w ೔ຊޠʹ༁͍ͯ͠Δํ͕͍Βͬ͠Ό͍·͢ w IUUQTHJUIVCDPNUJELJKZVO3Y4XJGUCMPC USBOTMBUFTJOUPKBQBOFTF%PDVNFOUBUJPO@KB 6OJUTNE

Slide 25

Slide 25 text

݁࿦

Slide 26

Slide 26 text

%SJWFS͸6*ͷͨΊͷ΋ͷ

Slide 27

Slide 27 text

͓ΘΓ