Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ReactiveCocoaでのフロー制御の例
Search
matuyuji
July 26, 2014
Programming
0
3.5k
ReactiveCocoaでのフロー制御の例
ReactiveCocoa 2.xを使ったサンプルアプリでのフロー制御例を紹介します。
matuyuji
July 26, 2014
Tweet
Share
More Decks by matuyuji
See All by matuyuji
Emacs × Touch Bar
matuyuji
2
1.8k
ARKit + SceneKitでMinesweeperを作ってみた
matuyuji
1
800
Go + QtでiOS アプリ開発
matuyuji
0
410
@_specialized なお話し
matuyuji
0
500
Xcode Souce Code Extensionを使ってみた
matuyuji
0
410
Codebeatを 試してみた
matuyuji
0
790
React Nativeで UIコンポーネントをつくる
matuyuji
0
1k
React Nativeを使ってみた
matuyuji
0
1.4k
SwiftでLens
matuyuji
1
1k
Other Decks in Programming
See All in Programming
レイトレZ世代に捧ぐ、今からレイトレを始めるための小径
ichi_raven
0
490
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
350
Building AI with AI
inesmontani
PRO
1
470
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
280
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
390
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
24
20k
dnx で実行できるコマンド、作ってみました
tomohisa
0
130
dotfiles 式年遷宮 令和最新版
masawada
1
550
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
130
モダンJSフレームワークのビルドプロセス 〜なぜReactは503行、Svelteは12行なのか〜
fuuki12
0
180
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
130
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
sg4k0
0
350
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Site-Speed That Sticks
csswizardry
13
980
Into the Great Unknown - MozCon
thekraken
40
2.2k
BBQ
matthewcrist
89
9.9k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
70
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Speed Design
sergeychernyshev
33
1.3k
How to Ace a Technical Interview
jacobian
280
24k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
The Cult of Friendly URLs
andyhume
79
6.7k
Transcript
3FBDUJWF$PDPB Ͱͷϑϩʔ੍ޚͷྫ @matuyuji ! ReactiveCocoaษڧձؔ 2014.7.24
!NBUVZVKJ w TBGYEFWCMPHTQPUKQ w &NBDT͍
3FBDUJWF$PDPBͬͯ ΞϓϦͭͬͯ͘Έͨ w .JP%BTICPBSE w HJUIVCDPNTBGY.JP%BTICPBSE
**+.JPΈ͓ΆΜ"1* w ߴ௨৴༻Ϋʔϙϯͷ0/0'' w Ϋʔϙϯྔɺʑͷར༻ྔ w 3&45"1* w 0"VUI +40/
Δ͜ͱ w +40/औಘ w IUUQTBQJJJKNJPKQNPCJMFEWDPVQPO w IUUQTBQJJJKNJPKQNPCJMFEWMPHQBDLFU w +40/σʔλͷϚʔδ w
0"VUIʹΑΔೝূ τʔΫϯ࠶औಘ
͍ͬͯΔ͜ͱ w +40/औಘ " IUUQTBQJJJKNJPKQNPCJMFEWDPVQPO # IUUQTBQJJJKNJPKQNPCJMFEWMPHQBDLFU w
+40/σʔλͷϚʔδ w 0"VUIʹΑΔೝূ τʔΫϯ࠶औಘ → AFNetworking-RACExtensionsͷ rac_startJSONRequestOperationWithRequest: → concat:ͰͱΓ͚͋͑ͣͬͭ͘Δɻ map:ͰMantle͔ͬͯΒϚʔδ → ΞΫηετʔΫϯΛnilʹͯ͠࠶࣮ߦ
+40/σʔλͷऔಘ (A) (B) rac_startJSONRequest…: defer defer rac_startJSONRequest…: concat: collect NSDict
NSDict NSDict × 2 NSArray → AFNetworking-RACExtensionsͷ rac_startJSONRequestOperationWithRequest:
γάφϧͰͷΠϕϯτ next completed error id NSError
"DPODBU# next completed error NSError id next id completed error
NSError
+40/σʔλͷऔಘ (A) (B) rac_startJSONRequest…: defer defer rac_startJSONRequest…: concat: collect NSDict
NSDict NSDict × 2 NSArray
+40/σʔλͷऔಘ - (RACSignal*)loadInformationSignal { RACSignal* coupon = [RACSignal defer:^RACSignal* {
return [self.restHelper getCoupon]; }]; ! RACSignal* packet = [RACSignal defer:^RACSignal* { return [self.restHelper getPacket]; }]; ! RACSignal* sig = [[coupon concat:packet] collect]; return sig; } தͰrac_startJSONRequestOperationWithRequest:ΛݺͿ
0"VUIͷೝূ - (RACSignal*)loadInformationSignal { RACSignal* coupon = [RACSignal defer:^RACSignal* {
return [self.restHelper getCoupon]; }]; ! RACSignal* packet = [RACSignal defer:^RACSignal* { return [self.restHelper getPacket]; }]; ! RACSignal* sig = [[coupon concat:packet] collect]; return self.restHelper.accessToken ? sig : [[[self.restHelper authorize] catch:self.errorBlock] concat:sig]; } complete͔error͚ͩฦ͢γάφϧ
0"VUIͷೝূ (A) (B) rac_start…: defer defer concat: collect NSDict NSDict
NSDict × 2 NSArray rac_start…: concat: authorize catch: NSArray
MPBE*OGPSNBUJPO4JHOBM (A) (B) rac_start…: defer defer concat: collect NSDict NSDict
NSDict × 2 NSArray rac_start…: concat: authorize catch: NSArray
MPBE*OGPSNBUJPO4JHOBM - (RACSignal*)loadInformationSignal { RACSignal* coupon = [RACSignal defer:^RACSignal* {
return [self.restHelper getCoupon]; }]; ! RACSignal* packet = [RACSignal defer:^RACSignal* { return [self.restHelper getPacket]; }]; ! RACSignal* sig = [[coupon concat:packet] collect]; return self.restHelper.accessToken ? sig : [[[self.restHelper authorize] catch:self.errorBlock] concat:sig]; }
ϚʔδͱτʔΫϯ࠶औಘ [[[self loadInformationSignal] catch: ^RACSignal *(NSError *error) { if (/*ΞΫηετʔΫϯ͕ແޮ*/)
{ self.restHelper.accessToken = nil; return [self loadInformationSignal]; } return [RACSignal empty]; //ଞͷΤϥʔ͖͋ΒΊΔ }] map:^(NSArray* array) { // MantleͰΦϒδΣΫτ࡞͔ͯ͠ΒɺσʔλΛ·ͱΊΔ }];
τʔΫϯ࠶औಘ (A) (B) rac_start…: defer defer concat: collect NSDict NSDict
NSDict × 2 NSArray rac_start…: concat: authorize catch: NSArray
ͬͨ͜ͱ w +40/औಘ " IUUQTBQJJJKNJPKQNPCJMFEWDPVQPO # IUUQTBQJJJKNJPKQNPCJMFEWMPHQBDLFU w
+40/σʔλͷϚʔδ w 0"VUIʹΑΔೝূ τʔΫϯ࠶औಘ → AFNetworking-RACExtensionsͷ rac_startJSONRequestOperationWithRequest: → concat:ͰͱΓ͚͋͑ͣͬͭ͘Δɻ map:ͰMantle͔ͬͯΒϚʔδ → ΞΫηετʔΫϯΛnilʹͯ͠࠶࣮ߦ
ͬͨϥΠϒϥϦ w 3FBDUJWF$PDPB w "'/FUXPSLJOH3"$&YUFOTJPOT w 6OEFSTDPSFN w .BOUMF w
58.FTTBHF#BS.BOBHFS w 75"DLOPXMFEHFNFOUT7JFX$POUSPMMFS w 9:1JF$IBSU w J041MPU
ؔ࿈ใ w 3FBDUJWF$PDPBؔ࿈ϦϯΫͷ·ͱΊ w TBGYEFWCMPHTQPUKQSFBDUJWFDPDPBIUNM