Slide 1

Slide 1 text

The introduction to RxSwift you've been missing @dtvd88 Վ෣ب࠲.tech#11

Slide 2

Slide 2 text

ࣗݾ঺հ • Vu Nhat Minh (@dtvd88) • RainbowStream࡞ऀ • ݱࡏ͸ScalaͱSwiftΤϯδχΞ • Swift Monad: Proof of concept • The introduction to RxSwift you've been missing • JLPT Free Quiz (~1ສ DL)

Slide 3

Slide 3 text

ࠓ೔ͷ಺༰ • RP(Reactive Programming)ͱ͸ • RxSwiftͱ͸ • The introduction to RxSwift you've been missing (͋ͳ͕ͨٻΊ͍ͯͨRxSwiftೖ໳)

Slide 4

Slide 4 text

Reactive Programming http://reactivex.io/

Slide 5

Slide 5 text

ඇಉظσʔλετϦʔϜΛ༻͍Δϓϩάϥϛϯά ObserverύλʔϯͱIteratorύλʔϯͱ ؔ਺ܕϓϩάϥϛϯά

Slide 6

Slide 6 text

ετϦʔϜΛ࡞੒ɺม׵ɺ߹੒͢Δૢ࡞ؔ਺ • ετϦʔϜ͸ෆมੑΛ࣋ͭ • ૢ࡞ؔ਺͸νΣʔϯͰ͖Δ

Slide 7

Slide 7 text

ReactiveExtension(Rx)ͷ࣮૷ϥΠάϥϦ Languages • Java: RxJava • JavaScript: RxJS • C#: Rx.NET • C#(Unity): UniRx • Scala: RxScala • Clojure: RxClojure • C++: RxCpp • Ruby: Rx.rb • Python: RxPY • Groovy: RxGroovy • JRuby: RxJRuby • Kotlin: RxKotlin • Swift: RxSwift • PHP: RxPHP Frameworks • RxNetty • RxAndroid • RxCocoa

Slide 8

Slide 8 text

RxSwiftͱ͸

Slide 9

Slide 9 text

Swift൛Rxͷ࣮૷ϥΠϒϥϦ • ϝΠϯϨϙ͸ReactiveXʹ഑ଐ: https://github.com/ ReactiveX/RxSwift • ࣗ෼ͰผͷίϛϡχςΟΛ͍࣋ͬͯΔɿhttps://github.com/ RxSwiftCommunity • RxSwiftͷษڧ = (RxSwift + RxCocoa + ίϛϡχ ςΟϥΠϒϥϦʔ)ͷษڧ

Slide 10

Slide 10 text

RxSwiftͰRealtime Github Search

Slide 11

Slide 11 text

RxSwiftͰRealtime Github Search let searchResults = searchBar.rx.text .throttle(0.3, scheduler: MainScheduler.instance) .distinctUntilChanged() .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { return Observable.just([]) } return searchGitHub(query) .catchErrorJustReturn([]) } .observeOn(MainScheduler.instance)

Slide 12

Slide 12 text

RxSwiftΛษڧ͢Δʹ͸

Slide 13

Slide 13 text

The introduction to Reactive Programming you've been missing • @andrestaltz͞Μͷૉ੖Β͍͠ೖ໳ΨΠυ • Twitterͷ"Who to follow" ਪનϘοΫεΛ࢖ͬͯReactive ProgrammingΛղઆ͢Δ • ͋ͳ͕ͨٻΊ͍ͯͨϦΞΫςΟϒϓϩάϥϛϯάೖ໳

Slide 14

Slide 14 text

The introduction to RxSwift you've been missing • Twitterͷ"Who to follow" ਪનϘοΫεΛ࢖͏ • αϯϓϧίʔυ͸Swift (RxSwift + RxCocoa) • ௨৴෦෼͸Moya/RxSwift • https://github.com/DTVD/The-introduction-to-RxSwift-you-have-been- missing

Slide 15

Slide 15 text

APIΛݺͼग़ͯ͠responseStreamΛ࡞੒ let refreshStream = refresh.rx_tap.startWith(()) let requestStream: Observable = refreshStream.map { _ in let random = Array(1...1000).random() return “https://api.github.com/users/" + String(random) } let responseStream = requestStream.flatMap { url in return UserModel().findUsers(url) } refreshStream: --tap-------tap----------tap------------|-> requestStream: --url-------url----------url------------|-> responseStream: -----[User]-----[User]-----[User]-------|->

Slide 16

Slide 16 text

APIΛݺͼग़ͯ͠responseStreamΛ࡞੒ let refreshStream = refresh.rx_tap.startWith(()) let requestStream: Observable = refreshStream.map { _ in let random = Array(1...1000).random() return “https://api.github.com/users/" + String(random)ɹ// String }ɹ// Observable let responseStream = requestStream.flatMap { url in return UserModel().findUsers(url) // Observable<[User]> }ɹ// Observable<[User]> refreshStream: --tap-------tap----------tap------------|-> requestStream: --url-------url----------url------------|-> responseStream: -----[User]-----[User]-----[User]-------|->

Slide 17

Slide 17 text

map ͱ flatMap let responseStream = requestStream.map { url in return UserModel().findUsers(url) // Observable<[User]> } // Observable>

Slide 18

Slide 18 text

map ͱ flatMap let responseStream = requestStream.flatMap { url in return UserModel().findUsers(url) // Observable<[User]> } // Observable<[User]>

Slide 19

Slide 19 text

શ͕ͯετϦʔϜʹͰ͖Δ

Slide 20

Slide 20 text

ObservableΛฦ͢ετϦʔϜ let closeStream = cell.cancel.rx_tap.startWith(()) let userStream: Observable = Observable.combineLatest(closeStream, responseStream){ (_, users) in guard users.count > 0 else {return nil} return users.random() } responseStream: --a-----------e--------i--------> closeStream: -----b----c--------d-------q----> vvvvvvvv combineLatest(f) vvvvvvv userStream: ----AB---AC--EC---ED--ID--IQ---->

Slide 21

Slide 21 text

CellͷσʔλʹόΠσΟϯά let nilOnRefreshTapStream: Observable = refresh.rx_tap.map {_ in return nil} let suggestionStream = Observable.of(userStream, nilOnRefreshTapStream) .merge() .startWith(.None) suggestionStream.subscribeNext{ op in guard let u = op else { return self.clearCell(cell) } return self.setCell(cell, user: u ) }.addDisposableTo(cell.disposeBagCell) nilOnRefreshTapStream: --n-----------n--------n--------> userStream: -----u----u--------u-------u----> vvvvvvvvvvvv merge() vvvvvvvvvvvv suggestionStream: --s--s----s---s----s---s-------->

Slide 22

Slide 22 text

ৄ͘͠͸Githubʹ͝ཡ͍ͩ͘͞!