RxSwift勉強会 @ Sansanの発表資料です http://connpass.com/event/27933/
3Y4XJGUͷPCTFSWF0OͱTVCTDSJCF0OΛཧղ͢Δେఉ ৻ҰגࣜձࣾϝϧΧϦ / גࣜձࣾικ2016/4/14RxSwiftษڧձ ˏ Sansan1
View Slide
ࣗݾհ2େఉ ৻Ұ ooba / bricklifeגࣜձࣾϝϧΧϦ20134݄ೖࣾݱࡏגࣜձࣾικग़தʮϝϧΧϦʯiOS൛ͷ্ཱͪ͛ʮϝϧΧϦ ΞοςʯiOS൛ͷ্ཱͪ͛
ϝϧΧϦΞος3ʮͳΜͰืूͰ͖ΔɹҬίϛϡχςΟΞϓϦʯ201510݄ ։ൃ։࢝20162݄ հ੍Ͱެ։20163݄ ਖ਼ࣜΦʔϓϯRxSwiftΛશ໘࠾༻
PCTFSWF0OͱTVCTDSJCF0O4
PCTFSWF0Oʹؔ͢Δ᷿ͷઆ໌5observeOnΑΓ͋ͱʹॻ͔Ε͍ͯΔΦϖϨʔλͷ࣮ߦεϨουΛܾΊΔͷΘ͔Γ͍࣮͢ࡍਖ਼͍͠
TVCTDSJCF0Oʹؔ͢Δ᷿ͷઆ໌6ετϦʔϜશମͷ࣮ߦεϨουΛܾΊΔͷʁsubscribeOnΑΓલʹॻ͔Ε͍ͯΔΦϖϨʔλͷ࣮ߦεϨουΛ͖ΊΔͷʁԿճॻ͍ͯҰ൪্ͷsubscribeOn͚͕ͩ༗ޮʹͳΔʁ
TVCTDSJCF0OͷϑΝʔετΠϯϓϨογϣϯ7ීஈʮsubscribeʯͱ͍͏୯ޠΛΈΔͷετϦʔϜͷߪಡ෦͚ͩͦͷͨΊɺ࠷ॳݟͨ࣌ʹsubscribeNextͳͲͷߪಡ෦ͷ࣮ߦεϨουΛܾΊΔͷͩͱࢥͬͨେ͖ͳؒҧ͍
ެࣜͷઆ໌8http://reactivex.io/documentation/scheduler.html
؆୯ͳ༻ྫ9ίʔυɿObservable.just(1).subscribeOn(backgroundScheduler).map { $0 * 2 }.observeOn(MainScheduler.instance).subscribe { print($0) }ग़ྗɿNext(2)Completed
؆୯ͳ༻ྫ10ίʔυɿObservable.just(1).subscribeOn(backgroundScheduler).map { $0 * 2 }.observeOn(MainScheduler.instance).subscribe { print($0) }ग़ྗɿNext(2)CompletedόοΫάϥϯυεϨουͰ࣮ߦ
؆୯ͳ༻ྫ11ίʔυɿObservable.just(1).subscribeOn(backgroundScheduler).map { $0 * 2 }.observeOn(MainScheduler.instance).subscribe { print($0) }ग़ྗɿNext(2)CompletedϝΠϯεϨουͰ࣮ߦ
0CTFSWFSͱ12
0CTFSWFSͱ13on()ͱ͍͏ϝιου͕࣮͞Ε͍ͯΔObservable͕ͦΕΛͬͯΠϕϯτΛୡ͢Δ͢ͳΘͪObserverType
0CTFSWFS5ZQF14protocol ObserverType {associatedtype Efunc on(event: Event)}
0CTFSWBCMFͱ15
0CTFSWBCMFͱ16subscribe()ͱ͍͏ϝιου͕࣮͞Ε͍ͯΔObserver͕ͦΕΛͬͯߪಡͰ͖Δ͢ͳΘͪObservableType
0CTFSWBCMF5ZQF17protocol ObservableType : ObservableConvertibleType {associatedtype Efunc subscribe(observer: O) -> Disposable}
ΦϖϨʔλͱ18
ΦϖϨʔλͱ19ObservableΛsubscribeͯ͠ɺ৽͍͠ObservableΛ࡞ΔͷObserverͱObservableͷ྆ํͷಇ͖Λ͢ΔRxSwiftͰશͯͷΦϖϨʔλʹΫϥε͕ఆٛ͞Ε͍ͯΔ
ͨͱ͑NBQ20map() = Map + MapSinkhttps://github.com/ReactiveX/RxSwift/blob/2.4/RxSwift/Observable.swifthttps://github.com/ReactiveX/RxSwift/blob/2.4/RxSwift/Observables/Implementations/Map.swiftMapObservableMapSinkObserver
PCTFSWF0OTVCTDSJCF0OʁͪΖΜobserveOnsubscribeOnʹΫϥε͕ఆٛ͞Ε͍ͯΔhttps://github.com/ReactiveX/RxSwift/blob/2.4/RxSwift/Observables/Implementations/ObserveOn.swifthttps://github.com/ReactiveX/RxSwift/blob/2.4/RxSwift/Observables/Implementations/SubscribeOn.swift21
ΦϖϨʔλ͕͍ͬͯΔ͜ͱ
PCTFSWF0OTVCTDSJCF0OΛΘͳ͍ྫ23Observable.just(1).map { $0 * 2 }.subscribe { print($0) }+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFS
ॲཧͷྲྀΕ24+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFS
ॲཧͷྲྀΕ251. AnonymousObserver͕Mapͷsubscribe()Λ࣮ߦsubscribe() ↑+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFS
ॲཧͷྲྀΕ261. AnonymousObserver͕Mapͷsubscribe()Λ࣮ߦ2. MapSink͕Justͷsubscribe()Λ࣮ߦsubscribe() ↑+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFSsubscribe() ↑
ॲཧͷྲྀΕ271. AnonymousObserver͕Mapͷsubscribe()Λ࣮ߦ2. MapSink͕Justͷsubscribe()Λ࣮ߦ3. Just͕MapSinkͷon()Λ࣮ߦsubscribe() ↑subscribe() ↑ ↓ on()+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFS
ॲཧͷྲྀΕ281. AnonymousObserver͕Mapͷsubscribe()Λ࣮ߦ2. MapSink͕Justͷsubscribe()Λ࣮ߦ3. Just͕MapSinkͷon()Λ࣮ߦ4. Map͕AnonymousObserverͷon()Λ࣮ߦ※ݫີʹͪΐͬͱҧ͏subscribe() ↑subscribe() ↑ ↓ on()↓ on()+VTU.BQ4JOL.BQ"OPOZNPVT0CTFSWFS
PCTFSWF0OTVCTDSJCF0OΛͬͨྫ29Observable.just(1).subscribeOn(backgroundScheduler).map { $0 * 2 }.observeOn(MainScheduler.instance).subscribe { print($0) }
ॲཧͷྲྀΕ300CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTU
1. AnonymousObserver͕ObserveOnͷsubscribe()Λ࣮ߦॲཧͷྲྀΕ310CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑
2. ObserveOnSink͕Mapͷsubscribe()Λ࣮ߦॲཧͷྲྀΕ320CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑
3. MapSink͕SubscribeOnͷsubscribe()Λ࣮ߦॲཧͷྲྀΕ330CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑
4. SubscribeOnSink͕Justͷsubscribe()ΛbackgroundScheduler্Ͱ࣮ߦॲཧͷྲྀΕ340CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑subscribe() ↑
5. Just͕SubscribeOnSinkͷon()ΛbackgroundScheduler্Ͱ࣮ߦॲཧͷྲྀΕ350CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑subscribe() ↑ ↓ on()
6. SubscribeOn͕MapSinkͷon()ΛbackgroundScheduler্Ͱ࣮ߦॲཧͷྲྀΕ360CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑subscribe() ↑ ↓ on()↓ on()
7. Map͕ObserveOnSinkͷon()ΛbackgroundScheduler্Ͱ࣮ߦॲཧͷྲྀΕ370CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑subscribe() ↑↓ on()↓ on()↓ on()
8. ObserveOn͕AnonymousObserverͷon()ΛMainScheduler্Ͱ࣮ߦॲཧͷྲྀΕ380CTFSWF0O4JOL0CTFSWF0O"OPOZNPVT0CTFSWFS.BQ4JOL.BQ4VCTDSJCF0O4JOL4VCTDSJCF0O+VTUsubscribe() ↑subscribe() ↑subscribe() ↑subscribe() ↑↓ on()↓ on()↓ on()↓ on()
ཁ͢Δʹ39• subscribeOnҎ߱(Observableํ)ͷsubscribe()ͷ࣮ߦεϨουΛܾΊΔ• observeOnҎ߱(Observerํ)ͷon()ͷ࣮ߦεϨουΛܾΊΔͱ͍͏ͷ͕ਖ਼͍͠ཧղʢͷͣʣ
TVCTDSJCF0O͕ޮ͔ͳ͍έʔε
TVCTDSJCF0O͕ޮ͔ͳ͍έʔεͦͷ̍41NSURLSessionͷrx_response• ࣮ߦεϨουNSURLSessionͷઃఆͰܾ·Δ• ϦΫΤετΛ͛Δͱ͜ΖͰޮ͘
/463-4FTTJPOͷ[email protected]42func rx_response(request: NSURLRequest) -> Observable {return Observable.create { observer inlet task = self.dataTaskWithRequest(request) { (data, response, error) inguard let response = response, data = data else {observer.on(.Error(error ?? RxCocoaURLError.Unknown))return}guard let httpResponse = response as? NSHTTPURLResponse else {observer.on(.Error(RxCocoaURLError.NonHTTPResponse(response: response)))return}observer.on(.Next(data, httpResponse))observer.on(.Completed)}let t = taskt.resume()return AnonymousDisposable {task.cancel()}}}https://github.com/ReactiveX/RxSwift/blob/2.4/RxCocoa/Common/Observables/NSURLSession+Rx.swiftこの部分の実⾏スレッドはRxの機能では指定できない
TVCTDSJCF0O͕ޮ͔ͳ͍έʔεͦͷ̎43͢Ͱʹ࣮ߦεϨου͕ܾ·͍ͬͯΔͷ• Hot Observableશൠ- PublishSubjectBehaviorSubjectͳͲͷSubjectܥ- shareReplay(1)ͳͲͷΦϖϨʔλʹΑͬͯHotԽ͞ΕͨObservable• UIKitܥͷRx֦ு• Driver
ݟ44ڍಈͷཧղʹࣗ৴͕ͳ͔ͬͨΒιʔεΛಡΉͱ͍͍ʢ͋ͨΓ·͑ʣ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ