Slide 1

Slide 1 text

Reactive Cocoa Λ SwiftͰ ΊͪΌϥΠτʹಋೖͯ͠Έͨ ͸ͳ͠ 2015/06/16 potato tips #18 Hiroki Kumamoto (@kumabook)

Slide 2

Slide 2 text

Who am I ? • Hiroki Kumamoto • @kumabook • ษڧձॳࢀՃʂ • झຯͰΞϓϦͭͬͯ͘·͢ • Իָ༻RSSϦʔμ iOSΞϓϦ MusicFav • https://github.com/kumabook/MusicFav/ • Feedly Cloud API library΋Ұॹʹ࡞੒ • https://github.com/kumabook/FeedlyKit

Slide 3

Slide 3 text

ΊͪΌϥΠτ? • FRPతʹ͸࢖ΘͣϥΠϒϥϦతʹ • ͦͷ̍ɿ௨৴ॲཧΛϓϩϛε෩ʹ • ͦͷ̎ɿObserver pattern (not binding)

Slide 4

Slide 4 text

ͦͷ1ɿϓϩϛε෩ʹ͔ͭ͏ • AFNetworkingΛϥοϓ͢Δ • callback ελΠϧ͔Β ϓϩϛε෩ʹ • SignalProducer (چColdSignal)

Slide 5

Slide 5 text

func getAllBlogs(#onSuccess: [Entry] -> Void, onFailure: NSError -> Void) -> Request func getAllBlogs() -> SignalProducer<[Entry], NSError>

Slide 6

Slide 6 text

func getAllBlogs() -> SignalProducer<[Blog], NSError> { return SignalProducer { (sink, disposable) in let manager = AFHTTPRequestOperationManager() let url = String(format: "%@/get_all_blogs", self.baseUrl + self.apiRoot) let operation = manager.GET(url, parameters: [:], success: { (operation:AFHTTPRequestOperation!, response:AnyObject!) -> Void in sink.put(.Next(Box(JSON(response).arrayValue.map({ Blog(json: $0) })))) sink.put(.Completed) }, failure: { (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in sink.put(.Error(Box(error))) }) disposable.addDisposable { operation.cancel() } }

Slide 7

Slide 7 text

func start(error: (E -> ())? = default, completed: (() -> ())? = default, interrupted: (() -> ())? = default, next: (T -> ())? = default) -> Disposable fetchAllBlogs().start(next: { blogs in doSomething(blogs) }, error: {e in … }, completed: { … })

Slide 8

Slide 8 text

͍͚ͦ͏ʂ ΋͏গ͠౿ΈࠐΜͰ
 ࢖ͬͯΈΑ͏
 ˠ when తͳ΍ͭ

Slide 9

Slide 9 text

• ෳ਺ͷॲཧ͕ऴΘͬͨޙʹҰ౓͚ͩॲཧΛ͢Δ • SignalProducer#concatͰ݁߹Ͱ͖Δ • Array#reduceͱ૊Έ߹ΘͤΕ͹
 ͍͍ײ͡ʹͰ͖ͦ͏ • [SignalProducer] ͔Β
 SignalProducer΁ม׵͢Δ

Slide 10

Slide 10 text

var signal = signals.reduce(SignalProducer.empty, combine: { (currentSignal, nextSignal) in currentSignal |> concat(nextSignal) }) • ॳظ஋͸
 SignalProducer.empty •Next が複数回きて最後にCompletedがくる

Slide 11

Slide 11 text

• ͜ͷล͔ΒͩΜͩΜָ͘͠ͳͬͯ͘Δ • ͱΓ͋͑ͣͳΜͰ΋SignalProducerΛฦͨ͘͠ͳΔ
 ˠܕΤϥʔʹ೰·͞ΕΔ

Slide 12

Slide 12 text

SignalProducer methods • SignalProducerΛอͬͨ··஋Λม͍͑ͨ
 ˠɹ|> map Λ࢖͏ • ೖΕࢠʹͳͬͯ͠·ͬͨ
 ˠ |> flatten Λ࢖͏ • unittest ͱ͔ Carthageͷιʔεͱ͔͕ࢀߟʹͳΔ

Slide 13

Slide 13 text

Observe Binding • Signal (چHotSignal) • Data binding ͱ͍͏ΑΓ 
 Observerύλʔϯతʹ࢖༻

Slide 14

Slide 14 text

ViewModel observe observe put Event enum Event { }

Slide 15

Slide 15 text

• ΍͍ͬͯΔ͜ͱ͸NSNotificationCenterͱ͔ͱมΘΒͳ͍͕
 ܕνΣοΫ͕ޮ͘ͷ͕҆৺ײ͋Δ • observeͨ͠΋ͷ͸dispose͢Δ • deinitΛ௨͍ͬͯΔ͔Ͱmemory leakνΣοΫ • Dead lock ͨ͠৔߹ • b _NSLockErrorͰϒϨΠΫϙΠϯτுΔ • RealmͷDAOͷϝιου಺ͰEventΛput

Slide 16

Slide 16 text

·ͱΊ • SignalProducerͱSignalΛத৺ʹϥΠτʹಋೖ • SignalProducer͸ϓϩϛεతʹ • Signal͸Observerతʹ • Action, Property, Binding (<~)͸FRPΛษڧͯ͠ ঃʑʹಋೖ͍͖͍ͯͨ͠

Slide 17

Slide 17 text

͋Γ͕ͱ͏͍͟͝·ͨ͠