Slide 1

Slide 1 text

RxSwiftͰTwitterͷ
 ϥΠϒϥϦΛ࡞ͬͯΔ࿩ (͍͍ͩͨ)৽ଔΤϯδχΞ޲͚ٕज़ަྲྀձ vol.6 on 2016/03/12 @mihyaeru21

Slide 2

Slide 2 text

͓લɺ୭Α • ϛώϟΤϧ @mihyaeru21 • Swift͓͡͞Μ • Kotlin͓͡͞Μ • ͱ͖Ͳ͖PerlϚϯ

Slide 3

Slide 3 text

RxSwift + Twitter

Slide 4

Slide 4 text

RxTwift

Slide 5

Slide 5 text

RxTwift • RxSwiftϕʔε • ґଘؚΊͯSwiftͷΈ • ܕܕܕ • https://github.com/mihyaeru21/RxTwift

Slide 6

Slide 6 text

͖ͯͱ͏ͳઆ໌ • TwitterͷAPIͱରԠͨ͠ΠϯλϑΣʔε • ApiΫϥε͸ɺ͍ͣΕRestApiʹ໊લ͕มΘΓͦ͏ let api = RxTwift.Api(…) api.get.statuses.homeTimeline() GET /statuses/home_timeline

Slide 7

Slide 7 text

͖ͯͱ͏ͳઆ໌ • શͯͷAPIϝιου͸ObservableΛฦ͢ api.get.statuses.homeTimeline() Observable

Slide 8

Slide 8 text

͖ͯͱ͏ͳઆ໌ • Observableͷத਎͸JSONͰ͸ͳ͍ΦϒδΣΫτ api.get.statuses.homeTimeline() .subscribeNext { tweet in print("\(tweet.user.name)\n\(tweet.text)") }

Slide 9

Slide 9 text

͖ͯͱ͏ͳઆ໌ • Observableͷத਎͸JSONͰ͸ͳ͍ΦϒδΣΫτ api.get.statuses.homeTimeline() .subscribeNext { tweet in print("\(tweet.user.name)\n\(tweet.text)") } ίʔυิ׬Ͱ͖Δ޾ͤʂʂʂ

Slide 10

Slide 10 text

ͪΐͬͱෳࡶͳྫ • ͋ΔϦετΛऔಘͯ͠ • ͦͷϦετ಺ͷϢʔβʢσϑΥϧτ͸20ਓʣ • ͷ͏ͪɺID͕ۮ਺ͷਓͷʢҙຯෆ໌ͳૢ࡞͚ͩͲྫ͔ͩΒڐͯ͠ʣ • λΠϜϥΠϯΛऔಘͯ͠ʢAPIΛୟ͖·͘Δʣ • දࣔ

Slide 11

Slide 11 text

Θʔɺ͍͢͝

Slide 12

Slide 12 text

த਎ͷ࿩

Slide 13

Slide 13 text

த਎ͷ࿩ • OAuth • ΦϒδΣΫτϚοϐϯά • Rx • ެ։APIϝιουͷྫ

Slide 14

Slide 14 text

OAuth • OAuthΛSwiftͰ࣮૷͍ͯ͠ΔϥΠϒϥϦ͸͋Δ • https://github.com/OAuthSwift/OAuthSwift • ͦΜͳʹଟػೳ͸ඞཁͳ͔ͬͨ • ετϦʔϛϯάʹରԠͰ͖ͳͦ͏ • ͱ͍͏Θ͚Ͱࣗ࡞ • HMAC-SHA1͚ͩCryptoSwiftʹґଘ • https://github.com/krzyzanowskim/CryptoSwift • ඞཁͳػೳΑΓଟػೳ͗͢Δ͔Βґଘ͔Β֎͍ͨ͠

Slide 15

Slide 15 text

OAuth: ೝূͷϔομΛ࡞Δ෦෼

Slide 16

Slide 16 text

OAuth • Ϧετॲཧͱ͔จࣈྻॲཧ͕׬݁ʹॻ͖΍͍͢ • ʢൺֱର৅ɿObjective-Cʣ • ྫ֎ॲཧ͸nilΛฦ͚ͩ͢ͷखൈ͖ • खൈ͖͚ͩͲ͜Ε͘Β͍ͷॲཧʹ͸े෼

Slide 17

Slide 17 text

ΦϒδΣΫτϚοϐϯά • Argo: https://github.com/thoughtbot/Argo • Swift޲͚ϥΠϒϥϦͰ࠷΋γϯϓϧʢͳίʔυʹͳΔ

Slide 18

Slide 18 text

ΦϒδΣΫτϚοϐϯά • README͔ΒҾ༻ struct User { let id: Int let name: String let email: String? let role: Role let companyName: String let friends: [User] }

Slide 19

Slide 19 text

ΦϒδΣΫτϚοϐϯά • README͔ΒҾ༻ extension User: Decodable { static func decode(j: JSON) -> Decoded { return curry(User.init) <^> j <| "id" <*> j <| "name" <*> j <|? "email" <*> j <| "role" <*> j <| ["company", "name"] <*> j <|| "friends" } }

Slide 20

Slide 20 text

ΦϒδΣΫτϚοϐϯά • มͳه߸ͱ͔ʹ͍ͭͯ͸ྑ͍ղઆهࣄ͕͋Δ • http://qiita.com/koher/items/300d89136b515291dac4

Slide 21

Slide 21 text

ΦϒδΣΫτϚοϐϯά

Slide 22

Slide 22 text

ΦϒδΣΫτϚοϐϯά ͕ࣜෳࡶ͗ͯ͢ίϯύΠϧͰ͖Ͷʔ͔Β ෼ׂͯͪ͠ΐ

Slide 23

Slide 23 text

ΦϒδΣΫτϚοϐϯά ࠅ͍͚Ͳಈ͘…

Slide 24

Slide 24 text

Rx • RxSwift • https://github.com/ReactiveX/RxSwift • ࠷ۙྲྀߦΓʁͷFRP • http://ninjinkun.hatenablog.com/entry/introrxja

Slide 25

Slide 25 text

Rx • Observable • 1ͭͷPromiseʹෳ਺ͷ஋ΛྲྀͤͯߴػೳԽͨ͠ײ͡ • ObservableΛ࡞ͬͨஈ֊Ͱ͸Կ΋͠ͳ͍ • ୭͔ʹsubscribe͞ΕΔ͜ͱʹΑͬͯىಈ

Slide 26

Slide 26 text

Rx: RxTwiftͰ͸ • APIڞ௨ͷϦΫΤετൃߦ෦෼ • Observable

Slide 27

Slide 27 text

Rx: RxTwiftͰ͸ • JSONจࣈྻΛදݱ͢ΔNSDataΛσίʔυ • ArgoʹΑͬͯΦϒδΣΫτʹม׵ • Observable • Observable • etc…

Slide 28

Slide 28 text

ެ։APIϝιουͷ࣮૷ྫ

Slide 29

Slide 29 text

ެ։APIϝιουͷ࣮૷ྫ

Slide 30

Slide 30 text

client.get(), client.post() • RxTwiftʹ͓͚ΔObservableͷݯྲྀ • Observable.create()ʹΑͬͯੜ੒ • த਎͸ෳࡶ͔ͩΒׂѪ

Slide 31

Slide 31 text

ެ։APIϝιουͷ࣮૷ྫ

Slide 32

Slide 32 text

Dictionary.createWithNotNil • nilͳཁૉΛল͍ͨDictionaryΛ࡞Δ

Slide 33

Slide 33 text

ެ։APIϝιουͷ࣮૷ྫ

Slide 34

Slide 34 text

Observable.decode()

Slide 35

Slide 35 text

ฦΓ஋ͷܕͰΦʔόʔϩʔυ ҧ͍͸͜Ε͚ͩ

Slide 36

Slide 36 text

Ϛοϐϯάର৅ͷܕ͸ฦΓ஋͔Βਪ࿦

Slide 37

Slide 37 text

Ϛοϐϯάର৅ͷܕ͸ฦΓ஋͔Βਪ࿦ ͜ΕʹΑͬͯͲͷΦϒδΣΫτ
 ʹϚοϐϯά͢Δ͔ܾ·Δ

Slide 38

Slide 38 text

Ϛοϐϯάର৅ͷܕ͸ฦΓ஋͔Βਪ࿦ ͜ΕʹΑͬͯͲͷΦϒδΣΫτ
 ʹϚοϐϯά͢Δ͔ܾ·Δ

Slide 39

Slide 39 text

Observable.flatMapSequence() • Observable<[T]> Λ Observable ʹม׵ • ετϦʔϜͱͯ͠ѻ͍΍ͯ͘͢͠Δ • ʢ͜ͷม׵͸ແ͔͘͢΋…ʣ

Slide 40

Slide 40 text

decode()ͷฦΓ஋ͷਪ࿦ • flatMapSequence() • Observable<[Tweet]> -> Observable • decode() • Observable -> Observable<[Tweet]>

Slide 41

Slide 41 text

ݱঢ়Ͱ͖͍ͯΔൣғ • OAuthೝূʹΑΔ௨৴ • GET/POST status/* ͷAPI • GET lists/* ͷAPI • ࣮૷ࡁΈAPIͷϨεϙϯεʹରԠ͢ΔΦϒδΣΫτ • TwitterଆΤϥʔʹରԠ͢ΔΦϒδΣΫτ

Slide 42

Slide 42 text

ࠓޙ࣮૷͢Δൣғ • ೝূͷτʔΫϯऔಘॲཧ • ະ࣮૷ͷREST API • ετϦʔϛϯάAPI • ύϥϝʔλʹԠͯ͡ϨεϙϯεJSONͷߏ଄͕
 มΘΔ͜ͱ΁ͷରԠ • ະ࣮૷ͷΦϒδΣΫτ