æéã®çµéãšãšãã«ãããã°ã©ãã³ã°èšèªã¯ãæ°ããæè¡ã®åºçŸãçŸä»£ã®èŠä»¶ããŸãã¯ã³ãŒãã®èšè¿°ã¹ã¿ã€ã«ãæŽæ°ããããšããåçŽãªæ¬²æ±ã®ããã«ã絶ããå€åãéçºããŠããŸãã ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¯ãReactive Cocoaãªã©ã®ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠå®è£
ã§ããŸãã ããã«ãããObjective-Cèšèªã®åœä»€åãå€æŽããããã®ããã°ã©ãã³ã°ã¢ãããŒãã«ã¯æšæºçãªãã©ãã€ã ãæäŸãããã®ããããŸãã ãã¡ãããããã¯iOSéçºè
ã®æ³šç®ãéããŠããŸãã
ReactiveCocoaã¯ãObjective-Cã«å®£èšåã®ã¹ã¿ã€ã«ããããããŸãã ããã¯ã©ãããæå³ã§ããïŒ CãC ++ãObjective-CãJavaãªã©ã®èšèªã§äœ¿çšãããåŸæ¥ã®åœä»€åã¹ã¿ã€ã«ã¯ã次ã®ããã«èª¬æã§ããŸããç¹å®ã®æ¹æ³ã§å®è¡ããå¿
èŠãããã³ã³ãã¥ãŒã¿ãŒããã°ã©ã ã®ãã£ã¬ã¯ãã£ããèšè¿°ããŸãã èšãæããã°ãããªãã¯äœãããããæ¹æ³ããšèšããŸãã 宣èšåããã°ã©ãã³ã°ã§ã¯ããå®è¡æ¹æ³ããå®çŸ©ããã«ãå¶åŸ¡ãããŒãäžé£ã®ã¢ã¯ã·ã§ã³ããå®è¡ããããšããšããŠèšè¿°ããããšãã§ããŸãã
åœä»€åããã°ã©ãã³ã°ãšé¢æ°åããã°ã©ãã³ã°
ããã°ã©ãã³ã°ãžã®å¿
é ã®ã¢ãããŒãã«ã¯ãã³ã³ãã¥ãŒã¿ãŒãã¿ã¹ã¯ãå®äºããããã«å¿
èŠãªåã¹ãããã®è©³çŽ°ãªèª¬æãå«ãŸããŸãã å®éãåœä»€åã¹ã¿ã€ã«ã¯ãã€ãã£ãããã°ã©ãã³ã°èšèªã§äœ¿çšãããŸãïŒãŸãã¯ãã·ã³ã³ãŒããèšè¿°ãããšãã«äœ¿çšãããŸãïŒã ã¡ãªã¿ã«ãããã¯ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã®ç¹åŸŽçãªæ©èœã§ãã
ããã©ããããæ©èœçã¢ãããŒãã§ã¯ãå®è¡ããå¿
èŠãããäžé£ã®æ©èœã䜿çšããŠåé¡ã解決ããŸãã åé¢æ°ã®å
¥åãã©ã¡ãŒã¿ãŒãšãåé¢æ°ãè¿ããã®ãå®çŸ©ããŸãã ããã2ã€ã®ããã°ã©ãã³ã°ã¢ãããŒãã¯éåžžã«ç°ãªããŸãã
èšèªéã®äž»ãªéãã¯æ¬¡ã®ãšããã§ãã
1.ç¶æ
ã®å€æŽ
çŽç²ãªé¢æ°åããã°ã©ãã³ã°ã®å Žåãå¯äœçšããªããããç¶æ
ã®å€æŽã¯ååšããŸããã å¯äœçšã«ã¯ãäœããã®å€éšæäœã«ããæ»ãå€ã«å ããŠãç¶æ
ã®å€åãå«ãŸããŸãã éšååŒã®SPïŒåç
§ééæ§ïŒã¯ãå€ãã®å Žåãå¯äœçšãªãããšå®çŸ©ãããäž»ã«çŽç²ãªé¢æ°ãæããŸãã ååŒäŒç€Ÿã¯ãåéšååŒãå®çŸ©ã«ããé¢æ°åŒã³åºãã§ãããããé¢æ°ãé¢æ°ã®å€æ°ç¶æ
ã«å€éšã¢ã¯ã»ã¹ããããšãèš±å¯ããŸããã
åé¡ãæ確ã«ããããã«ãçŽç²é¢æ°ã«ã¯æ¬¡ã®å±æ§ããããŸãã
- å¯äžã®æ³šç®ãã¹ãçµè«ã¯æ»ãå€ã§ã
- å
¥åãã©ã¡ãŒã¿ãŒã®å¯äžã®äŸåé¢ä¿ã¯åŒæ°ã§ã
- åŒæ°ã¯ãåºåãçæããåã«å®å
šã«å®çŸ©ãããŸã
æ©èœçãªã¢ãããŒãã¯å¯äœçšãæå°éã«æãããšããäºå®ã«ããããããããããã¯ããããéçºã®å
éšçãªéšåã§ãããããå®å
šã«åé¿ããããšã¯ã§ããŸããã
äžæ¹ãåœä»€åããã°ã©ãã³ã°ã®é¢æ°ã«ã¯åç
§ã®éææ§ããªããããã宣èšåã¢ãããŒããšåœä»€åã¢ãããŒãã®å¯äžã®éãã§ããå¯èœæ§ããããŸãã å¯äœçšã¯ãç¶æ
ãšI / Oãå®è£
ããããã«åºã䜿çšãããŠããŸãã ãœãŒã¹èšèªã®ã³ãã³ãã¯ç¶æ
ãå€æŽã§ãããããåãèšèªåŒã«å¯ŸããŠç°ãªãå€ãåŸãããŸãã
ãªã¢ã¯ãã£ãã³ã³ã¢ã¯ã©ãã§ããïŒ ããã¯Objective-Cã®æ©èœãã¬ãŒã ã¯ãŒã¯ã§ããObjective-Cã¯æŠå¿µçã«åœä»€åã®èšèªã§ãããæ瀺çã«çŽç²ãªé¢æ°ã¯å«ãŸããŸããã ç¶æ
ã®å€åãåé¿ããããšããå Žåãå¯äœçšã¯å¶éãããŸããã
2.æåã®ã¯ã©ã¹ã®ãªããžã§ã¯ã
é¢æ°åããã°ã©ãã³ã°ã«ã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®ãªããžã§ã¯ãã§ãããªããžã§ã¯ããšé¢æ°ããããŸãã ããã¯ã©ãããæå³ã§ããïŒ ããã¯ãé¢æ°ããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããããå€æ°ã«å²ãåœãŠãããããé¢æ°ããè¿ãããããšãæå³ããŸãã ãªãããã䟿å©ãªã®ã§ããïŒ ããã«ãããå®è¡ãããã¯ãç°¡åã«ç®¡çããé¢æ°ãã€ã³ã¿ãŒïŒchar *ïŒ*ïŒ** foo [] [8]ïŒïŒïŒïŒ[];-funïŒïŒãªã©ã®ããŸããŸãªæ¹æ³ã§é¢æ°ãäœæããã³çµåããããšãã§ããŸãã
åœä»€åã¢ãããŒãã䜿çšããèšèªã«ã¯ããã¡ãŒã¹ãã¯ã©ã¹åŒã«é¢ããç¬èªã®ç¹æ§ããããŸãã Objective-Cã¯ã©ãã§ããïŒ ã¯ããŒãžã£ãŒå®è£
ãšããŠãããã¯ããããŸãã é«æ¬¡é¢æ°ïŒFWPïŒã¯ããããã¯ããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããããšã§ã¢ãã«åã§ããŸãã ãã®å Žåããããã¯ã¯ã¯ããŒãžã£ãŒã§ãããç¹å®ã®ãããã¯ã®ã»ããããé«æ¬¡é¢æ°ãäœæã§ããŸãã
ãã ããé¢æ°åèšèªã§FVPãæäœããããã»ã¹ã¯ããé«éãªæ¹æ³ã§ãããå¿
èŠãªã³ãŒãè¡ãå°ãªããªããŸãã
3.ã¡ã€ã³ã¹ããªãŒã 管ç
åœä»€åã®ã«ãŒãã¯ãé¢æ°åããã°ã©ãã³ã°ã®ååž°é¢æ°ã®åŒã³åºããšããŠè¡šãããŸãã é¢æ°åèšèªã®å埩ã¯éåžžãååž°ã«ãã£ãŠè¡ãããŸãã ãªãã§ïŒ ããããè€éãã®ããã«ã Objective-Cã®éçºè
ã«ãšã£ãŠãã«ãŒãã¯ããã°ã©ãã«ãšã£ãŠéåžžã«åœ¹ç«ã¡ããã§ãã ååž°ã¯ãRAMã®éå°ãªæ¶è²»ãªã©ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãããïŒ ã«ãŒããååž°ã䜿ããã«é¢æ°ãæžãããšãã§ããŸãã ã³ã¬ã¯ã·ã§ã³ã®åèŠçŽ ã«é©çšã§ããç¡éã«å¯èœãªç¹æ®åãããã¢ã¯ã·ã§ã³ã®ããããã«å¯ŸããŠãé¢æ°åããã°ã©ãã³ã°ã¯ã
map ããã
fold ããã
filter ããªã©ã®åå©çšå¯èœãªå埩é¢æ°ã䜿çšããŸãã ãããã®æ©èœã¯ããœãŒã¹ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã«åœ¹ç«ã¡ãŸãã éè€ãæžãããå¥ã®é¢æ°ãæžãå¿
èŠããããŸããã ïŒç¶ããèªãã§ãããã«ã€ããŠãã£ãšæ
å ±ããããŸãïŒïŒ
4.å®è¡ã®é åº
宣èšåŒã¯ãsubexpressioné¢æ°ãžã®åŒæ°ã®è«çé¢ä¿ãšå®æ°ç¶æ
é¢ä¿ã®ã¿ã瀺ããŸãã ãã®ãããå¯äœçšããªãå Žåãåé¢æ°åŒã³åºãã®ç¶æ
ã®é·ç§»ã¯ä»ã®é¢æ°åŒã³åºããšã¯ç¬ç«ããŠçºçããŸãã
åœä»€åŒã®æ©èœçãªé åºã¯ãæ®çºæ§ã®ç¶æ
ã«äŸåããŸãã ãããã£ãŠãå®è¡é åºã¯éèŠã§ããããœãŒã¹ã³ãŒãã®æ§æã«ãã£ãŠæé»çã«æ±ºå®ãããŸãã ãã®åé¡ã§ã¯ãäž¡æ¹ã®ã¢ãããŒãã®è©äŸ¡æŠç¥ã®éããææã§ããŸãã
é¢æ°åããã°ã©ãã³ã°èšèªã§å¿
èŠãªãšãã«åŒã³åºãããé
延èšç®ãŸãã¯èšç®ã¯ãæŠç¥ã§ãã ãã®å ŽåãåŒã®è©äŸ¡ã¯ãã®å€ãå¿
èŠã«ãªããŸã§å»¶æãããŸããããã«ãããè©äŸ¡ãç¹°ãè¿ãããã®ãé²ããŸãã ã€ãŸããåŒã¯äŸååŒãè©äŸ¡ãããšãã«ã®ã¿è©äŸ¡ãããŸãã æäœã®é åºãäžæ確ã«ãªããŸãã
ããã©ããããåœä»€åèšèªã§ã®ç²Ÿåçãªèšç®ã¯ãå€æ°ã«ãã€ã³ãããããšããã«åŒãè©äŸ¡ãããããšãæå³ããŸãã ãã®ãããéšååŒã«ã¯ä»ã®åŒã®èšç®ã«åœ±é¿ããå¯äœçšããããããéšååŒïŒé¢æ°ãå«ãïŒããã€èšç®ãããããå€æããã®ã¯ç°¡åã§ãã
5.ã³ãŒãã®é
ããã¯éèŠã§ããæ©èœçãªã¢ãããŒãã§ã¯ãåœä»€åãããå°ãªãã³ãŒããèšè¿°ããå¿
èŠããããŸãã ããã«ãããã¯ã©ãã·ã¥ãå°ãªããªãããã¹ãããã³ãŒããå°ãªããªããéçºãµã€ã¯ã«ãããçç£çã«ãªããŸãã ã·ã¹ãã ã¯åžžã«é²åãæé·ããŠãããããããã¯éèŠã§ãã
ReactiveCocoaã®äž»èŠã³ã³ããŒãã³ã
é¢æ°åããã°ã©ãã³ã°ã¯ãfutureïŒå€æ°ã®èªã¿åãå°çšè¡šçŸïŒããã³promiseïŒfutureã®èªã¿åãå°çšè¡šçŸïŒãšããŠç¥ãããæŠå¿µã§æ©èœããŸãã ãããã«ã¯äœãè¯ãã®ã§ããããïŒ åœä»€åããã°ã©ãã³ã°ã§ã¯ãæ¢åã®å€ãæäœããå¿
èŠããããããéåæã³ãŒããšä»ã®åé¡ãåæããå¿
èŠãçããŸãã ãã ããfutureããã³promiseã®æŠå¿µã䜿çšãããšããŸã äœæãããŠããªãå€ãæäœã§ããŸãïŒéåæã³ãŒãã¯åææ¹åŒã§èšè¿°ãããŸãïŒã
ä¿¡å·
æªæ¥ãšçŽæã¯ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®ã·ã°ãã«ãšããŠæ瀺ãããŸãã
RACSignalã¯ãReactiveCocoaã®äž»èŠã³ã³ããŒãã³ãã§ãã ããã¯ãå°æ¥æ瀺ãããã€ãã³ãã®ã¹ããªãŒã ãæ瀺ããæ©äŒãæäŸããŸãã ã·ã°ãã«ããµãã¹ã¯ã©ã€ãããæéã®çµéãšãšãã«çºçããã€ãã³ãã«ã¢ã¯ã»ã¹ããŸãã ã·ã°ãã«ã¯ããã·ã¥ããªãã³ã¹ããªãŒã ã§ããããã¿ã³ãæŒããéåæãããã¯ãŒã¯æäœãã¿ã€ããŒããã®ä»ã®UIã€ãã³ãããŸãã¯æéã®çµéãšãšãã«å€åãããããããã®ã䜿çšã§ããŸãã éåææäœã®çµæããã€ã³ãããè€æ°ã®ã€ãã³ããœãŒã¹ãå¹æçã«çµåã§ããŸãã
ã·ãŒã±ã³ã¹
å¥ã®ã¿ã€ãã®ã¹ããªãŒã ã¯ã·ãŒã±ã³ã¹ã§ãã ä¿¡å·ãšã¯ç°ãªããã·ãŒã±ã³ã¹ã¯ãã«é§ååã®ã¹ããªãŒã ã§ãã ããã¯ãNSArrayãšåãç®çãæã€äžçš®ã®ã³ã¬ã¯ã·ã§ã³ã§ãã RACSequenceã䜿çšãããšã
NSArrayã³ã¬ã¯ã·ã§ã³ã®ããã«ãç¹å®ã®æäœãé£ç¶çã«ã§ã¯ãªããå¿
èŠã«å¿ããŠå®è¡ã§ããŸãã ã·ãŒã±ã³ã¹å
ã®å€ã¯ãããã©ã«ãã§æå®ãããŠããå Žåã«ã®ã¿è©äŸ¡ãããŸãã ã·ãŒã±ã³ã¹ã®äžéšã®ã¿ã䜿çšãããšãããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
RACSequenceã䜿çšãããšãCocoaã³ã¬ã¯ã·ã§ã³ãæ®éçã§å®£èšçãªæ¹æ³ã§åŠçã§ããŸãã RACã¯ãã»ãšãã©ã®Cocoaã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã«-rac_sequenceã¡ãœãããè¿œå ããŠãRACSequencesãšããŠäœ¿çšã§ããããã«ã
ãŸã ã
ããŒã
ç¹å®ã®ã¢ã¯ã·ã§ã³ã«å¿ããŠã
RACCcommandãäœæãããã·ã°ãã«ããµãã¹ã¯ã©ã€ãããŸãã ããã¯äž»ã«UIã€ã³ã¿ã©ã¯ã·ã§ã³ã«é©çšãããŸãã ReactiveCocoaãæäŸããã»ãšãã©ã®
UIKitã³ã³ãããŒã«ã®
UIKitã«ããŽãªã¯ãUIã€ãã³ããåŠçããæ£ããæ¹æ³ãæäŸããŸãã ãã¿ã³ã®ã¯ãªãã¯ã«å¿çããŠãŠãŒã¶ãŒãç»é²ããå¿
èŠããããšæ³åããŠã¿ãŸãããã ãã®å Žåãã³ãã³ãã¯ãããã¯ãŒã¯èŠæ±ãè¡šãå ŽåããããŸãã ããã»ã¹ãéå§ããããšããã¿ã³ã¯ãã®ç¶æ
ããéã¢ã¯ãã£ããã«ããŸãã¯ãã®éã«å€æŽããŸãã ä»ã«äœïŒ ããŒã ã§ã¢ã¯ãã£ããªä¿¡å·ãéä¿¡ã§ããŸãïŒå°éå¯èœæ§ãè¯ãäŸã§ãïŒã ãããã£ãŠããµãŒããŒã䜿çšã§ããªãå ŽåïŒããã "ãªã³ã·ã°ãã«"ïŒãã³ãã³ãã¯äœ¿çšã§ããªããªããé¢é£ããã³ã³ãããŒã«ã®åã³ãã³ãã¯ãã®ç¶æ
ãåæ ããŸãã
åºæ¬æäœã®äŸ
åºæ¬çãªRACSignalsæäœãã©ã®ããã«æ©èœãããã瀺ãå³ã次ã«ç€ºããŸãã
ããŒãž
+ (RACSignal *)merge:(id<NSFastEnumeration>)signals;
çµæã¹ã¬ããã«ã¯ãäž¡æ¹ã®ã€ãã³ãã¹ããªãŒã ãããŒãžãããŠããŸãã ãããã£ãŠãã+ããŒãžãã¯ãã€ãã³ãã®ç¹å®ã®ãœãŒã¹ãæ°ã«ããã1ãæã§åŠçãããå Žåã«åœ¹ç«ã¡ãŸãã ãã®äŸã§ã¯ãstateLabel.textã¯å®è¡ãå®äºããšã©ãŒã®3ã€ã®ç°ãªãä¿¡å·ã䜿çšããŸãã
RACCommand *loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
ã³ã³ããã©ãã¹ã
+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals reduce:(id (^)())reduceBlock;
ãã®çµæãã¹ããªãŒã ã«ã¯ãéä¿¡ãããã¹ããªãŒã ã®ææ°ã®å€ãå«ãŸããŸãã ã¹ã¬ããã®1ã€ãéèŠã§ãªãå Žåãçµæã¯ç©ºã«ãªããŸãã
ãã€äœ¿çšã§ããŸããïŒ åã®äŸãåãäžããŠãããã«ããžãã¯ãè¿œå ããŸãããã ãŠãŒã¶ãŒãæ£ããé»åã¡ãŒã«ãšãã¹ã¯ãŒããå
¥åããå Žåã«ã®ã¿ããã°ã€ã³ãã¿ã³ãæå¹ã«ãããšäŸ¿å©ã§ãããïŒ ãã®ã«ãŒã«ã¯æ¬¡ã®ããã«å®£èšã§ããŸãã
ACSignal *enabledSignal = [RACSignal combineLatest:@[self.emailField.rac_textSignal, self.passwordField.rac_textSignal] reduce:^id (NSString *email, NSString *password) { return @([email isValidEmail] && password.length > 3); }];
*ã§ã¯ããã°ã€ã³ã³ãã³ããå°ãå€æŽããŠãå®éã®loginButtonã«æ¥ç¶ããŸãããã
RACCommand *loginCommand = [[RACCommand alloc] initWithEnabled:enabledSignal signalBlock:^RACSignal *(id input) {
å¹³åŠåããã
- (RACSignal *)flattenMap:(RACStream * (^)(id value))block;
ãã®é¢æ°ã䜿çšããŠãå
ã®ã¹ã¬ããã®å€ããšã«æ°ããã¹ã¬ãããäœæããŸãïŒfïŒã çµæã¹ããªãŒã ã¯ããœãŒã¹ã¹ããªãŒã ã§çæãããå€ã«åºã¥ããŠæ°ããä¿¡å·ãè¿ããŸãã ãããã£ãŠãéåæã«ããããšãã§ããŸãã
ã·ã¹ãã ã§ã®èªèšŒã®ãªã¯ãšã¹ãã¯ãFacebookïŒèå¥åãªã©ïŒããã®ããŒã¿ã®åä¿¡ãšããã¯ãšã³ããžã®è»¢éãšãã2ã€ã®éšåã§æ§æãããŠãããšæ³åããŠã¿ãŸãããã èŠä»¶ã®1ã€ã¯ããã°ã€ã³ããã£ã³ã»ã«ã§ããå¿
èŠããããŸãã ãããã£ãŠãã¯ã©ã€ã¢ã³ãã³ãŒãã¯ããã£ã³ã»ã«ã§ããããã«ãã°ã€ã³ããã»ã¹ã®ç¶æ
ãåŠçããå¿
èŠããããŸãã ããã«ãããç¹ã«è€æ°ã®å Žæãããã°ã€ã³ã§ããå Žåãå€ãã®å®åã³ãŒããæäŸãããŸãã
ReactiveCocoaã¯ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ ããã¯ãã°ã€ã³ã®å®è£
ã§ããå¯èœæ§ããããŸãã
- (RACSignal *)authorizeUsingFacebook { return [[[FBSession rac_openedSession] flattenMap:^RACStream *(FBSession *session) { return [session rac_fetchProfile]; }] flattenMap:^RACStream *(NSDictionary *profile) { return [self authorizeUsingFacebookProfile:profile]; }]; }
å¡äŸïŒ
+ [FBSession rac_openedSession]-FBSessionã®éå§ã«ã€ãªããã·ã°ãã«ã å¿
èŠã«å¿ããŠã
Facebookã®ãã°ã€ã³ã«ã€ãªããå¯èœæ§ããã
ãŸã ã
-[FBSession rac_fetchProfile]-selfãšããŠéä¿¡ãããã»ãã·ã§ã³ãéããŠãããã¡ã€ã«ããŒã¿ãååŸããä¿¡å·ã
ãã®ã¢ãããŒãã®å©ç¹ã¯ããŠãŒã¶ãŒã«ãšã£ãŠã¹ããªãŒã å
šäœããã¡ãžãŒã§ãããFacebookãã°ã€ã³ãããã¯ãšã³ãã³ãŒã«ãã«é¢ä¿ãªãããã¹ããŒãžãã§ãã£ã³ã»ã«ã§ããåäžã®ä¿¡å·ã§è¡šãããããšã§ãã
ãã£ã«ã¿ãŒ
- (RACSignal *)filter:(BOOL (^)(id value))block;
çµæãšããŠãã¹ããªãŒã ã«ã¯ãæå®ãããé¢æ°ã«åŸã£ãŠãã£ã«ã¿ãªã³ã°ãããã¹ããªãŒã ãaãã®å€ãå«ãŸããŸãã
RACSequence *sequence = @[@"Some", @"example", @"of", @"sequence"].rac_sequence; RACSequence *filteredSequence = [sequence filter:^BOOL(id value) { return [value hasPrefix:@"seq"]; }];
å°å³
- (RACSignal *)map:(id (^)(id value))block;
FlattenMapãšã¯ç°ãªããMapã¯åæçã«å®è¡ãããŸãã ããããã£ãaãã®å€ã¯ãæå®ãããé¢æ°fïŒx + 1ïŒãééãã衚瀺ãããåæå€ãè¿ããŸãã
ç»é¢ã«ã¢ãã«ã¿ã€ãã«ãå
¥åããããã«ããã€ãã®å±æ§ãé©çšãããšããŸãã ãäžéšã®å±æ§ã®é©çšããå¥ã®æ©èœãšããŠèª¬æãããŠããå Žåãããããæ©èœããŸãã
RAC(self.titleLabel, text) = [RACObserve(model, title) map:^id(NSString *modelTitle) { NSDictionary *attributes = @{}; return [[NSAttributedString alloc] initWithString:modelTitle attributes:attributes]; }];
ä»çµã¿ïŒ
self.titleLabel.textã ãã«ã¹ã¿ã å±æ§ãé©çšããŠ
model.titleã®å€æŽãšçµã¿åãããŸãã
éµäŸ¿çªå·
+ (RACSignal *)zip:(id<NSFastEnumeration>)streams reduce:(id (^)())reduceBlock;
çµæãããŒã€ãã³ãã¯ãåã¹ã¬ãããåæ°ã®ã€ãã³ããçæãããšãã«äœæãããŸãã ããã«ã¯ã3ã€ã®çµåãããã¹ã¬ããã®ããããããã®å€ãå«ãŸããŸãã
ããã€ãã®å®çšçãªäŸã§ã¯ãzipã¯
dispatch_group_notifyãšããŠèšè¿°ã§ããŸãããšãã°ã3ã€ã®å¥ã
ã®ä¿¡å·ãããããããã®å¿çãåäžã®ãã€ã³ãã§çµåããå¿
èŠããããŸãã
NSArray *signals = @[retrieveFacebookContactsSignal, retrieveAddressBookContactsSignal]; return [RACSignal zip:signals reduce:^id (NSArray *facebookContacts, NSArray *addressBookContacts){ NSArray *mergedContacts =
ã¹ãããã«
- (RACSignal *)throttle:(NSTimeInterval)interval;
ç¹å®ã®æéã«èšå®ãããã¿ã€ããŒã䜿çšããŠãã¹ããªãŒã ãaãã®æåã®å€ã¯ã¿ã€ããŒã®æåŸã§ã®ã¿çµæã¹ããªãŒã ã«éä¿¡ãããŸãã æå®ãããæéééå
ã«æ°ããå€ãçæããããšãæåã®å€ãä¿æãããçµæã¹ããªãŒã ã«è»¢éãããªããªããŸãã 代ããã«ãçµæã¹ããªãŒã ã«2çªç®ã®å€ã衚瀺ãããŸãã
é©ãã¹ãã±ãŒã¹ïŒãŠãŒã¶ãŒãsearchFieldãå€æŽãããšãã«ãªã³ããã³ãã§æ€çŽ¢ãè¡ãå¿
èŠããããŸãã æšæºçãªã¿ã¹ã¯ã§ããïŒ ãã ããtextFieldã¯1ç§éã«å€ãã®ãã®ãããªã€ãã³ããçæããå¯èœæ§ãããããããã¯ãŒã¯ãéå¹ççã«äœ¿çšãããããããã¹ããå€æŽããããã³ã«ãããã¯ãŒã¯ãªã¯ãšã¹ããäœæããã³éä¿¡ããã«ã¯ããŸãå¹æçã§ã¯ãããŸããã
ããã§ã®è§£æ±ºçã¯ãé
延ãè¿œå ããŠãããããã¯ãŒã¯èŠæ±ãå®éã«å®è¡ããããšã§ãã ããã¯éåžžãNSTimerãè¿œå ããããšã§å®çŸãããŸãã ReactiveCocoaã䜿çšãããšãã¯ããã«ç°¡åã«ãªããŸãïŒ
[[[seachField rac_textSignal] throttle:0.3] subscribeNext:^(NSString *text) {
*ããã§éèŠãªç¹ã¯ããæåŸã®ãããã¹ããã£ãŒã«ããåé€ãããåã«ããã¹ãŠã®ãåã®ãããã¹ããã£ãŒã«ããå€æŽãããããšã§ãã
é
延/é
延
- (RACSignal *)delay:(NSTimeInterval)interval;
ã¹ããªãŒã ãaãã§åä¿¡ãããå€ã¯é
延ãããäžå®ã®æéééåŸã«çµæã¹ããªãŒã ã«éä¿¡ãããŸãã
é¡äŒŒãšããŠ-[RACSignalã¹ãããã«ïŒ]ãé
延ã¯ã次ã®ãããã³ãå®äºãããã€ãã³ãã®éä¿¡ã®ã¿ãé
延ãããŸãã
[[textField.rac_textSignal delay:0.3] subscribeNext:^(NSString *text) { }];
Reactive Cocoaã®å¥œããªãšãã
- iOSã§Cocoaãã€ã³ãã£ã³ã°ãå°å
¥
- å°æ¥ã®ããŒã¿ã«å¯Ÿããæäœãäœæããæ©èœã Scalaã®å
ç©ãšçŽæã«ã€ããŠã®ã¡ãã£ãšããçè«ããããŸãã
- éåææäœãåææ¹åŒã§æ瀺ããæ©èœã ãªã¢ã¯ãã£ãCocoaã¯ããããã¯ãŒã¯ã³ãŒããªã©ã®éåæãœãããŠã§ã¢ãç°¡çŽ åããŸãã
- 䟿å©ãªå解ã ãŠãŒã¶ãŒã€ãã³ããšã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®å€æŽã«é¢é£ä»ããããã³ãŒãã¯ãéåžžã«è€éã§ãããã«ãããªãå¯èœæ§ããããŸãã Reactive Cocoaã¯ãäŸåããæäœã¢ãã«ãç¹ã«ã·ã³ãã«ã«ããŸãã çµåããããããŒã®åœ¢åŒã§æäœãæ瀺ãããšïŒããšãã°ããããã¯ãŒã¯èŠæ±ããŠãŒã¶ãŒã€ãã³ããªã©ã®åŠçïŒãé«åºŠãªã¢ãžã¥ãŒã«æ§ãšèªç±ãªéä¿¡ãå®çŸã§ããã³ãŒããããé »ç¹ã«ç¹°ãè¿ã䜿çšã§ããŸãã
- ããããã£éã®åäœãšé¢ä¿ã¯å®£èšåãšããŠå®çŸ©ãããŸãã
- åæã®åé¡ã解決ããŸã-è€æ°ã®ã·ã°ãã«ãçµã¿åãããå Žåããã¹ãŠã®çµæãåŠçããããã®åäžã®å ŽæããããŸãïŒæ¬¡ã®å€ãå®äºã·ã°ãã«ããšã©ãŒã®ããããïŒ
RACãã¬ãŒã ã¯ãŒã¯ã䜿çšãããšãããåªããé«ã¬ãã«ã®æ¹æ³ã§å€ã®ã·ãŒã±ã³ã¹ãäœæããã³å€æã§ããŸãã RACã䜿çšãããšããããã¯ãŒã¯ã®å¿çãäŸåå€ã®å€æŽããã®åŸã®åå¿ãªã©ãéåææäœã®å®äºãæåŸ
ãããã¹ãŠã管çãããããªããŸãã äžèŠããŠå¯ŸåŠããã®ã¯é£ããã§ãããReactiveCocoaã¯äŒææ§ã§ãïŒ