Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RxSwift Driver

RxSwift Driver

RxSwiftのDriverについてpotatotips #28で発表した際のスライドです http://connpass.com/dashboard/

Motoki Narita

April 20, 2016
Tweet

More Decks by Motoki Narita

Other Decks in Technology

Transcript

  1. QPUBUPUJQT
    3Y4XJGUͷ%SJWFS
    .PUPLJ/BSJUB
    [email protected]@

    View Slide

  2. ࣗݾ঺հ
    w ੒ాݩًʢͳΓͨ΋ͱ͖ʣ
    w [email protected]@
    w גࣜձࣾωΫετͰɹɹ)0.&`4ͱ͍͏

    ෆಈ࢈ݕࡧΞϓϦͷJ04ΤϯδχΞΛ΍͍ͬͯ·͢
    w ݸਓͰ΋ΧϝϥΞϓϦΛ࡞ͬͨΓ
    w ࠷ۙ͸3Y4XJGUʹऔΓ૊ΜͰ͍Δ

    View Slide

  3. %SJWFSͱ͸ʁ

    View Slide

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

    View Slide

  5. υΩϡϝϯτ͔Β஌Δ

    View Slide

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

    View Slide

  7. αϯϓϧίʔυ͔Β஌Δ

    View Slide

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

    View Slide

  9. $PEF3FBEJOH

    View Slide

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

    View Slide

  11. 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)
    }

    View Slide

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

    View Slide

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

    View Slide

  14. 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)

    View Slide

  15. 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)
    ൺֱ

    View Slide

  16. όΠϯυ͢Δͱ͖

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. CJOE5Pͷํ͸஫ҙ

    Τϥʔͱ͔ϝΠϯεϨουͱ͔

    View Slide

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

    View Slide

  22. ͜͜·Ͱͷ·ͱΊ

    View Slide

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

    View Slide

  24. %SJWFSͷಛ௃͸ҎԼʹॻ͔Ε͍ͯΔ
    w 6OJUTNE
    w IUUQTHJUIVCDPN3FBDUJWF93Y4XJGUCMPC
    NBTUFS%PDVNFOUBUJPO6OJUTNE
    w ೔ຊޠʹ༁͍ͯ͠Δํ͕͍Βͬ͠Ό͍·͢
    w IUUQTHJUIVCDPNUJELJKZVO3Y4XJGUCMPC
    USBOTMBUFTJOUPKBQBOFTF%[email protected]
    6OJUTNE

    View Slide

  25. ݁࿦

    View Slide

  26. %SJWFS͸6*ͷͨΊͷ΋ͷ

    View Slide

  27. ͓ΘΓ

    View Slide