$30 off During Our Annual Pro Sale. View Details »

RxSwiftでエラーを分岐するTips

yimajo
November 15, 2018

 RxSwiftでエラーを分岐するTips

potatotips #56 での発表資料です

https://potatotips.connpass.com/event/104242/

yimajo

November 15, 2018
Tweet

More Decks by yimajo

Other Decks in Technology

Transcript

  1. 3Y4XJGUͰΤϥʔΛ෼ذ͢Δ
    5JQT
    ࠓ৓ળۣ!ZJNBKP
    QPUBUPUJQT4NBSU/FXTࣾ։࠵
    ͬͯςΩετ͕ग़͖ͯͨΒͦ͜͸੝Γ্͕ΓϙΠϯτͰ͢ʂ
    3FDZDMFE"MVNJOJVN
    Ҏ߱ͷεϥΠυʹ

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. J04ΞϓϦ։ൃܥͷٕज़ಉਓࢽΛ#005)Ͱެ։͍ͯ͠·͢
    4XJGUBTZODBXBJUݚڀಡຊ
    ԁ
    IUUQTTXJGUCPPUIQN

    View Slide

  4. ͞Βʹࠓ݄৽͘͠ެ։͠·ͨ͠ʂ
    3Y4XJGUݚڀಡຊᶗ
    ԁ
    IUUQTTXJGUCPPUIQN

    3FDZDMFE"MVNJOJVN

    View Slide

  5. ຊ୊

    View Slide

  6. 3Yͷҟৗऴྃͷݪଇ
    ˣ
    0CTFSWBCMFγʔέϯεʹ
    Τϥʔྲྀ͞ΕΔͱͦΕҎ߱
    ߪಡͰ͖ͳ͘ͳΔ


    View Slide

  7. ҟৗॲཧܥͷύλʔ
    ϯ͸৭ʑ
    ΤϥʔΛΩϟονͯ͠PO&SSPSͱͯ͠ྲྀ͞ͳ͍Α͏ʹ͢Δ
    w DBUDI&SSPS\^ͯ͠Τϥʔʹରॲ
    w 0CTFSWBCMF3FTVMUͳܕͰྲྀ͢
    w ͜͜Ͱͷ3FTVMU͸੒൱ͱͦͷ৘ใΛؚΉFOVN
    0CTFSWBCMFγʔέϯεΛ෼ذ͢Δ
    w 0CTFSWBCMF3FTVMUͳܕʹͨ͠΋ͷΛ͞Βʹͭͷγʔέϯεਖ਼ৗͱҟ
    ৗܥʹ෼ذ
    w ࢀߟϝϧΧϦΞοςͷ3Y4XJGU࣮૷ΨΠυIUUQTTQFBLFSEFDLDPNQBSBLFFUZ
    NFSVLBSJBUVUFGBMTFSYTXJGUTIJ[IVBOHHBJEP TMJEF

    View Slide

  8. 0CTFSWBCMFγʔέϯεΛ
    ਖ਼ৗܥͱΤϥʔͰ෼ذ͢Δͷ͸
    3Y4XJGUͷNBUFSJBMJ[F࢖͑͹
    ָʹͰ͖·͢Αͱ͍͏ͷ͕
    ࠓճͷ5JQT

    View Slide


  9. NBUFSJBMJ[F

    &WFOU &WFOU
    ☓ &WFOU
    3YͷNBUFSJBMJ[F
    ϝιουͰΠϕϯτΛSFQSFTFOUͨ͠
    0CTFSWBCMF&WFOU5ͳγʔέϯεΛ৽ͨʹ࡞Δ

    View Slide

  10. ਖ਼ৗܥͱҟৗܥͷΠϕϯτΛ
    औΓग़ͤΔΑ͏ͳϝιουΛ༻ҙ
    extension ObservableType where E: EventConvertible {
    public func elements() -> Observable {
    return filter { $0.event.element != nil }
    .map { $0.event.element! }
    }
    public func errors() -> Observable {
    return filter { $0.event.error != nil }
    .map { $0.event.error! }
    }
    }
    // 1. ObservableͷE͕EventConvertible४ڌͰ͋Ε͹࢖͑ΔΑ͏ʹͳΔ
    // ྫ͑͹ Observable> ͱ͔
    // 2_1. Πϕϯτͷਖ਼ৗܥelementͷΈΛฦ͢Α͏ʹ͢Δ͚ͩ
    // 2_2. ΠϕϯτͷΤϥʔͷΈΛฦ͢Α͏ʹ͢Δ͚ͩ

    View Slide

  11. ར༻ྫ

    View Slide

  12. let result = Observable.of(1, 2)
    .flatMap { _ -> Observable> in
    let observable = Observable.create { observer in
    observer.onNext("A")
    observer.onError(TestError.test)
    observer.onNext(“B")
    observer.onCompleted()
    return Disposables.create()
    }
    return observable.materialize()
    }
    output1 = result
    .elements()
    .subscribe(onNext: {
    print("elements, onNext: \($0)”)
    }, onError: {
    print("elements, onError: \($0)")
    },)
    error = result
    .errors()
    .subscribe(onNext: {
    print("errors, onNext: \($0)")
    }, onError: {
    print("errors, onError: \($0)")
    })
    —— ग़ྗ ——
    elements, onNext: A
    elements, onNext: A
    elements, onCompleted:
    errors, onNext: test
    errors, onNext: test
    errors, onCompleted:

    View Slide

  13. ͱ͍͏͜ͱͰ
    FMFNFOUT
    ͱFSSPST
    ϝιουΛFYUFOTJPOʹ͠
    ର৅ͷ0CTFSWBCMFγʔέϯεʹ
    NBUFSJBMJ[F
    ͢Δ͚ͩͰ
    FSSPSͷγʔέϯε͕෼ذͰ͖Δʜ

    View Slide

  14. 7JFX.PEFM
    MFUPVUQVU%SJWFS#PPM
    MFUFSSPS%SJWFS&SSPS
    ͔͠͠
    &SSPSܕͬͯΧόʔൣғ޿͗͢ΔͷͰ͸ʁ
    ࣗલͰΤϥʔ෼ذͯ͠ΔΜ͔ͩΒܕΛ੍ݶ͢Ε͹͍͍ͷʹ

    View Slide

  15. ྫಛఆͷΤϥʔʹ͢Δ
    let error: Observable = result
    .errors()
    .map {
    guard let error = $0 as? OAuthSwiftError else {
    // ͜͜ͰΫϥογϡϨϙʔτૹΓͭͭ
    ….
    fatalError($0.localizedDescription)
    }
    return error
    }
    .share(replay: 1)
    w Ͱ͖Δ͚Ͳ΋ʜ
    w ΍Δඞཁ͕͋ΔͱࢥͬͨΒ΍ͬͨΒΑΖͦ͠͏
    w .PEFM૚ͷԞਂ͘ͰಛఆͷΤϥʔͷΈΛ૝ఆ͍ͯ͠Δ৔߹ͳͲ
    w ͦ͜·Ͱ΍Δඞཁͳͦ͞͏ͱ൑அͰ͖Δͱ͖
    w 7JFX.PEFMͷϓϨθϯςʔγϣϯϩδοΫͰ&SSPS൑ผ͢Ε͹͍
    ͍ͱ͍͏৔߹ͳͲ

    View Slide

  16. ͔͠͠ࠔͬͨ͜ͱʹ

    View Slide

  17. 4JOHMF΍.BZCF $PNQMFUBCMFͰ͸
    ͦͷ··Ͱ͸
    NBUFSJBMJ[F͸࢖͑ͳ͍

    View Slide

  18. 1SPUPDPM
    0CTFSWBCMF5ZQF
    NBUFSJBMJ[F

    1SPUPDPM
    1SJNJUJWF4FRVFODF5ZQF
    $MBTT
    0CTFSWBCMF&
    1SPUPDPM
    0CTFSWBCMF$POWFSUJCMF5ZQF
    4USVDU
    1SJNJUJWF4FRVFODF5SBJU &MFNFOU
    4JOHMFͳͲ

    View Slide

  19. 4JOHMFͰNBUFSJBMJ[FΛ࢖͍͍ͨ৔߹
    BT0CTFSWBCMF
    NFUFSJBMJ[F

    View Slide

  20. ྫ͑͹4JOHMFΛฦ͢ΠϯλϑΣʔε͕
    ͋ͬͨͱͯ͠
    ͦ͏͍͏΋ͷ͸
    BT0CTFSWBCMF
    NFUFSJBMJ[F

    ͢Δ͜ͱʹΑͬͯ
    0CTFSWBCMF&WFOU3FTQPOTF
    ͱͳΔ
    func request(_ param: RequestParam) -> Single {}

    View Slide

  21. ͦ΋ͦ΋
    ͳͥ͜ͷ෼ذํ๏ʹ
    ؾ͍͔ͮͨ

    View Slide

  22. 3Y4XJGU&YU
    IUUQTHJUIVCDPN3Y4XJGU$PNNVOJUZ3Y4XJGU&YU
    w FMFNFOUT
    FSSPST

    w VOXSBQ

    w JHOPSF @WBMVFT5P*HOPSF&ʜ

    w OPU

    w pMUFS.BQ\^
    FUD

    View Slide

  23. IUUQTHJUIVCDPN3FBDUJWF93Y4XJGUQVMM
    3Y4XJGU

    ͦ΋ͦ΋ઌʹ3Y4XJGU&YUͰNBUFSJBMJ[F͕࣮૷͞Ε
    ͦΕ͕3Y4XJGUʹऔΓࠐ·Εͨ

    View Slide

  24. ·ͱΊ
    w ΤϥʔΛ෼ذ͍ͨ͠ͱ͖͸0CTFSWBCMF&WFOU5
    w NBUFSJBMJ[F
    ݺ΂͹ˢʹͳΔ
    w &WFOUͷpMUFSͱNBQ͢ΔϝιουͰͭʹ෼ذ
    w &SSPSΛ೚ҙͷ&SSPSʹͰ͖ΔͷͰ΍ͬͯ΋͍͍
    w NBUFSJBMJ[F
    ͸0CTFSWBCMF5ZQFʹ͔࣮͠૷͞Ε͍ͯͳ͍
    ͷͰ4JOHMF .BZCF $PNQMFUFEͳͲͰ͸࢖͑ͳ͍

    View Slide

  25. Ҏ্Ͱ͢
    ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide