ã¢ããªã±ãŒã·ã§ã³ã®äžéšãšããŠã®ãããã¯ãŒã¯ã³ã¢
ãŸãããã®èšäºã§èª¬æããå 容ã«ã€ããŠå°ã説æããŸãã ç§ã®æèŠã§ã¯ãã»ãšãã©ã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã¯ã¯ã©ã€ã¢ã³ããµãŒããŒã§ãã ããã¯ãã³ãŒãã«ãããã¯ãŒã¯ã³ã¢ãå«ãŸããŠããããšãæå³ãããµãŒããŒããã®ãªã¯ãšã¹ãã®éä¿¡ãšã¬ã¹ãã³ã¹ã®åä¿¡ãè¡ããŸãã ãããŠãRESTãªã¯ãšã¹ãã®éä¿¡ããã«ãããŒãããã£ã®æ§ç¯ããœã±ãããWebãœã±ãããªã©ã®æäœã®ãããªãäœã¬ãã«ããªã¯ãšã¹ã管çãæ åœãããããã¯ãŒã¯ã©ã€ãã©ãªã«ã€ããŠã§ã¯ãããŸããã ããã¯ããµãŒããŒåºæã®èŠæ±ãå¿çãããã³ã¹ããŒã¿ã¹ããŒã¿ã管çã§ããè¿œå ã®ãã€ã³ãã£ã³ã°ã§ãã ç§ãååããªããã°ãªããªãã£ãå€ãã®ã¢ãã€ã«ãããžã§ã¯ãã®ãããã¯ãŒã¯ã¬ãã«ã®äž»ãªåé¡ãçµè«ä»ããããã®ã¯ããã®ã¹ãã©ãããå®è£ ããããã®ãªãã·ã§ã³ã§ãã
ãã®èšäºã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã¯ãŒã¯ã³ã¢ãæ§ç¯ããããã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã®1ã€ãæäŸããããšãç®çãšããŠããŸããããã¯ãããŸããŸãªã¢ãã«ãšããŸããŸãªãµãŒããŒAPIãé·å¹Žäœ¿çšããŠãããã®ã§ãçŸåšããããžã§ã¯ãã§äœæ¥ããŠããã¿ã¹ã¯ã«æé©ã§ãã æ°ãããããžã§ã¯ããéå§ããããæ¢åã®ãããžã§ã¯ããå€æŽãããããå Žåããã®ãªãã·ã§ã³ããé©åã«æ§æããã容æã«æ¡åŒµå¯èœãªãããã¯ãŒã¯ã³ã¢ãéçºããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ãŸããã³ãŒãããã³/ãŸãã¯ææ¡ãããã¢ãŒããã¯ãã£ã®æ¹åã«é¢ããã¢ããã€ã¹ãã³ã¡ã³ãããåŸ ã¡ããŠãããŸãã ãããŠãã¯ãããã®èšäºã¯å€§éã«çºè¡ãããããã2ã€ã®ããŒãã§ãªãªãŒã¹ãããŸãã
ã«ããã®äžã®è©³çŽ°ã
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®çžäºäœçš
ãã®ããã»ã¹ã§ã¯ãRESTãããã³ã«ã䜿çšããŠæ§ç¯ããããµãŒããŒãšäœããã®åœ¢ã§å¯Ÿè©±ããããŸããŸãªãããžã§ã¯ããå解ããå¿ èŠããããŸãã ãŸãããããã®ãããžã§ã¯ãã®ã»ãšãã©ã«ã¯ãã誰ã森ã«ããã®ãã誰ãfireã«ããã®ãããšããã«ããŽãªã®åçããããŸãããããã¯ãŒã¯ã³ã¢ã¯ã©ãã§ãç°ãªãæ¹æ³ã§å®è£ ãããŠããããã§ãïŒãã ããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®ã¢ãŒããã¯ãã£éšåãšåæ§ïŒã ç¹ã«æªãã®ã¯ãäºãã«æåããè€æ°ã®éçºè ã®æã1ã€ã®ãããžã§ã¯ãã«è¡šç€ºãããå Žåã§ãïŒãããŠãååãšããŠå³ããç· ãåãã®äžã§ããïŒã ãã®ãããªå Žåãããã¯ãã°ãã°ããªãäžæ°å³ãªå€èŠ³ã®ãã³ã¢ãã§ãããã»ãšãã©ç¬èªã®ç¥æ§ãæã£ãŠããŸãã ææ¡ãããã¢ãããŒãã䜿çšããŠããã®ãããªåé¡ããèªåèªèº«ãä¿è·ããŠã¿ãŸãããã
ã©ãããå§ããŸããïŒ
- å®è£
ã«ã¯ãSwiftããŒãžã§ã³3.0èšèªã䜿çšããŸãã
- GETããã³POSTãªã¯ãšã¹ãã§ã®ã¿åäœããæ¶ç©ºã®RESTãµãŒããŒã䜿çšããããšã«åæããŸãã çããšããŠãJSONãŸãã¯äžéšã®ããŒã¿ãè¿ããŸãïŒæ®å¿µãªããããã¹ãŠã®ãµãŒããŒãçµ±äžãããå¿çãã©ãŒã ãæã£ãŠããããã§ã¯ãªããããç°ãªããªãã·ã§ã³ãæäŸããå¿
èŠããããŸãïŒã
- ãŸãããäœã¬ãã«ããããã¯ãŒã¯éä¿¡ã®ããã«å¥åã®ãããã¯ãŒã¯ã©ã€ãã©ãªãå¿
èŠãšããªãããšã«åæããŸãïŒç¹ã«ããã®èšäºã®å·çæç¹ã§ã¯ããŒãžã§ã³3.0ã«æŽæ°ããããããã¯ãŒã¯ã©ã€ãã©ãªã¯ãªãããïŒã
- ææ¡ãããã¢ãããŒãã¯ãSOAïŒãµãŒãã¹æåã¢ãŒããã¯ãã£ïŒã¢ãŒããã¯ãã£ã®ç°¡æããŒãžã§ã³ã§ããããªã¢ãŒããããžã§ã¯ãã¯å°ããªãããžã§ã¯ãïŒåå¥ã®ãã£ãã·ã¥ãµãã·ã¹ãã ãªã©ïŒã§äœ¿çšããããSwiftèšèªã®å³å¯ãªã¿ã€ãã³ã°ã«é©åããŠããŸãã
- å®è£ ã«ã¯ãXcode Playgroundã§ååã§ããå¥ã®ãããžã§ã¯ãã¯å¿ èŠãããŸããã
å§ããŸãããã ãŸããããã»ã¹èªäœã«ã€ããŠå°ã説æããŸãã ã¯ã©ã€ã¢ã³ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ããµãŒããŒãšã©ã®ããã«æ©èœãããã段éçã«èª¬æããŸãã
- ãŠãŒã¶ãŒã¯ããµãŒããŒãšã®å¯Ÿè©±ãå¿
èŠãšããã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯ã³ã¢ãä»ããŠãµãŒããŒã«GETãŸãã¯POSTãªã¯ãšã¹ããéä¿¡ããç¹å®ã®URLãããããŒã»ããããªã¯ãšã¹ãæ¬æãã¿ã€ã ã¢ãŠãããã£ãã·ã¥ããªã·ãŒãããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒãèšå®ããŸãã
- ãµãŒããŒã¯èŠæ±ãåŠçããã¢ããªã±ãŒã·ã§ã³ã®å¿çã«éä¿¡ããŸãïŒéä¿¡ãã£ãã«ã«åé¡ãçºçããå Žåã¯éä¿¡ããŸããïŒã
- ã¢ããªã±ãŒã·ã§ã³ã¯åä¿¡ããæ å ±ãåæããã¹ããŒã¿ã¹ããŒã¿ãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ããŸãã
ãããŠãããã§ã®é£ããã¯äœã§ããïŒ
ãããŠçå®ã¯ããã¹ãŠãéåžžã«ã·ã³ãã«ã«èãããäžæ¹ã§ã§ãã ãã ããå®éã«ã¯ããããã®4ã€ã®åçŽãªãã€ã³ãã«ã¯è¿œå ã®äººä»¶è²»ãå¿ èŠãšããè¿œå ã®æé ãå«ãŸããŠããããããã®éåžžã«äžéçãªæé ãå®è£ ãããšããç¹ã§å€æ§æ§ãå§ãŸããŸãã ã·ãŒã±ã³ã¹ãå°ãæ¡åŒµããäœæ¥ã®éçšã§çãã質åã§è£è¶³ããŸãã
- ãŠãŒã¶ãŒã¯ããµãŒããŒãšã®å¯Ÿè©±ãå¿
èŠãšããã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã¯ããµãŒããŒã«é¢é£ä»ããããã¹ããŒã¿ã¹ããŒã¿ã«äŸåããŸããïŒ ããšãã°ãã¢ã¯ã·ã§ã³ã«ã¯èªèšŒããŒã¯ã³ãå¿
èŠã§ããïŒ ãããããªãããããã©ãã«ä¿ç®¡ããããã©ã®ããã«ç¢ºèªããã®ã
- ãµãŒããŒAPIã¯ãæ¿èªããŒãããŠãŒã¶ãŒããŒã¿ãæäœããããã®ããŒããªã©ãããã€ãã®ãã¢ã¯ã»ã¹ãã€ã³ããã§æ§æã§ããŸãã ãã¹ãŠã®ã³ãŒãã1ã€ã®å€§ããªã·ãŒãã«ãã³ãããªãããã«ããããã®ã¢ã¯ã·ã§ã³ãäœããã®æ¹æ³ã§ã°ã«ãŒãã«åå²ãããšããã§ãããã
- ãŠãŒã¶ãŒã¯ã¢ã¯ã·ã§ã³ããã£ã³ã»ã«ãããå ŽåããããŸãïŒã¢ããªã±ãŒã·ã§ã³ããã®æ©äŒã圌ã«æäŸããå ŽåïŒã ãã®ãããªç¶æ³ã«ã察åŠã§ããªããã°ãªããŸããã
- ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã¯ããµãŒããŒã«é¢é£ä»ããããã¹ããŒã¿ã¹ããŒã¿ã«äŸåããŸããïŒ ããšãã°ãã¢ã¯ã·ã§ã³ã«ã¯èªèšŒããŒã¯ã³ãå¿
èŠã§ããïŒ ãããããªãããããã©ãã«ä¿ç®¡ããããã©ã®ããã«ç¢ºèªããã®ã
- ã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯ã³ã¢ãä»ããŠGETãŸãã¯POSTãªã¯ãšã¹ãããµãŒããŒã«éä¿¡ããŸãã
- ãµãŒããŒã«ã¯åå¥ã®ããŒã¹URLïŒè€æ°ã®å ŽåããããŸãïŒããããããã«å¯ŸããŠçµ¶å¯Ÿã¢ãã¬ã¹ãäœæãããŸãã å€ãã®ã³ãŒããè²»ãããªãããã«èšå®ããå¿
èŠããããŸããã¢ã¯ã·ã§ã³ã®çš®é¡ã¯åãã§ã¯ãããŸããããåæã«ãœãªã¥ãŒã·ã§ã³ãã«ã¹ã¿ãã€ãºå¯èœã«ããŸãã
- åãªã¯ãšã¹ãã«ã¯ãå¿
é ã®ããããŒã»ãããšãéåä¿¡ãããããŒã¿ã®ã¿ã€ããªã©ãç¹å®ã®ãªã¯ãšã¹ãã«å¿
èŠãªè¿œå ããããŒãå«ãŸããå ŽåããããŸãã
- ãªã¯ãšã¹ãã¯ãç¹å®ã®ã¿ã€ã ã¢ãŠãããã³ããŒã¿ãã£ãã·ã³ã°ããªã·ãŒã䜿çšããŠãç¹å¥ãªã»ãã·ã§ã³ïŒURLSessionã«é¢ããã¹ããŒãïŒã§èµ·åã§ããŸãã
- çŸåšå®è¡äžã®ãã¹ãŠã®éåæãªã¯ãšã¹ãã®ãªã¹ãããããšäŸ¿å©ã§ããããã¯ãåæãšãããã°æ
å ±ã®äž¡æ¹ã®ç¹ã§åœ¹ç«ã¡ãŸãã
- ãµãŒããŒã«ã¯åå¥ã®ããŒã¹URLïŒè€æ°ã®å ŽåããããŸãïŒããããããã«å¯ŸããŠçµ¶å¯Ÿã¢ãã¬ã¹ãäœæãããŸãã å€ãã®ã³ãŒããè²»ãããªãããã«èšå®ããå¿
èŠããããŸããã¢ã¯ã·ã§ã³ã®çš®é¡ã¯åãã§ã¯ãããŸããããåæã«ãœãªã¥ãŒã·ã§ã³ãã«ã¹ã¿ãã€ãºå¯èœã«ããŸãã
- ãµãŒããŒã¯èŠæ±ãåŠçããã¢ããªã±ãŒã·ã§ã³ã®å¿çã«éä¿¡ããŸãïŒéä¿¡ãã£ãã«ã«åé¡ãçºçããå Žåã¯éä¿¡ããŸããïŒã
- åçã®åä¿¡ã¯äžå®å®ãªã€ãã³ãã§ãããããåçã ãã§ãªãçæããããšã©ãŒãåŠçã§ããå¿
èŠããããŸãã ãŸãããµãŒããŒAPIã«ã¯å¿çãšãšã©ãŒã¡ãã»ãŒãžã®çµ±äžãããæ§é ããªãããšãå€ãããšãèæ
®ãããšãã·ã¹ãã ãå«ãããŸããŸãªãšã©ãŒåœ¢åŒãåä¿¡ããæºåãããå¿
èŠããããŸãã
- æåããå¿çïŒãµãŒããŒAPIã®å®è£
ã«å¿ããŠïŒã§ã¯ãæåããå¿çèªäœãšæäœã®åŠçã«å¯ŸãããµãŒããŒã®æåŠã®äž¡æ¹ãåãåãå ŽåãããããïŒããšãã°ããŠãŒã¶ãŒæ¿èªã«ãã£ãŠéããããèŠæ±ã®æ¿èªããŒã¯ã³ãæå®ãå¿ããå ŽåïŒãæåããåçãšãæåãããšã©ãŒãã åæã«ããã³ãã©ãŒèªäœãã³ãŒãå
ã®èªå·±å®çµåã®åã
ã®ãšã³ãã£ãã£ã®åœ¢åŒã§é
眮ããããšããå§ãããŸããããã¯ãåæãšä¿å®ã容æã§ãã
- åçã®åä¿¡ã¯äžå®å®ãªã€ãã³ãã§ãããããåçã ãã§ãªãçæããããšã©ãŒãåŠçã§ããå¿
èŠããããŸãã ãŸãããµãŒããŒAPIã«ã¯å¿çãšãšã©ãŒã¡ãã»ãŒãžã®çµ±äžãããæ§é ããªãããšãå€ãããšãèæ
®ãããšãã·ã¹ãã ãå«ãããŸããŸãªãšã©ãŒåœ¢åŒãåä¿¡ããæºåãããå¿
èŠããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã¯åä¿¡ããæ
å ±ãåæããã¹ããŒã¿ã¹ããŒã¿ãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ããŸãã
- ãã®é ç®ã«ãããç¶æ ããŒã¿ã®ä¿åã®åé¡ã«æ»ããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã衚瀺ããããã«å¿ èŠãªãµãŒããŒã®å¿çããããŒã¿ãéžæããå¿ èŠããããŸãããŸãããµãŒããŒãžã®ãããªããªã¯ãšã¹ãã«å¿ èŠãªããŒã¿ãéžæããåŠçãã䟿å©ãªåœ¢åŒã§ä¿åããå¿ èŠããããŸãã
ããã¯ããªãåçŽãªè³ªåã®ã»ããã®ããã«æããŸãããèšèªã§äœ¿çšã§ããããŒã«ã®æ°ãšå€æ§æ§ã®ããããããžã§ã¯ããããããžã§ã¯ããžã®ããããã¹ãŠã®æ®µéã®å®è£ ã¯ãèªèãè¶ ããŠç°ãªãå ŽåããããŸãã ã¡ãªã¿ã«ãããããªä¿®æ£ãå ããããšã§ãææ¡ãããã¢ãããŒããObjective-Cã«ïŒåŒ±ãã¿ã€ãã³ã°ãæã€èšèªãšããŠïŒé©çšã§ããŸãããããã¯ãã®èšäºã®ç¯å²å€ã§ãã
èšèš
äžèšã®ãã¹ãŠã®è³ªåã解決ããã«ã¯ãããã€ãã®ãšã³ãã£ãã£ãå¿ èŠã§ãã
- ãæåãããšã©ãŒãã«é¢ããæ
å ±ã ãã®ãšã³ãã£ãã£ã¯ãããšã©ãŒã®æåããŸãã¯ããµãŒããŒé害ãã«é¢ããæ
å ±ã®åä¿¡ãšä¿åãä¿èšŒããŸããããã¯ãç§ãæãããåŒãã§ãããã®ã§ã-ããšãã°ãèªèšŒãšã©ãŒãªã©ã
- ãµãŒããŒã®å¿çæ
å ±ã ãµãŒããŒããåä¿¡ãããã¹ãŠã®æ
å ±ãä¿åããããããäžè¶³ããªãããšãä¿èšŒãããŸãã é
ããæ©ããããããžã§ã¯ãã¯ãURLResponseãã©ã¡ãŒã¿ãŒãŸã§ããµãŒããŒããéä¿¡ããããã®ãåæããå¿
èŠãããããããã®ãããªããŒã¿ããã¹ãŠè¿
éã«ã¢ã¯ã»ã¹ã§ããããã«ããããšããå§ãããŸãã
- éåæãããã¯ãŒã¯ã¿ã¹ã¯ã å®éã«ã¯ãéåæã¿ã¹ã¯èªäœã¯ããã®ç¶æ
ãšããã¡ãããµãŒããŒèŠæ±èªäœãå«ãå
¥åããã³åºåãã©ã¡ãŒã¿ãŒãæ ŒçŽããŸãã
- ã¿ã¹ã¯ããŒã«ã ãã®ã¯ã©ã¹ã¯ãã¢ã¯ãã£ããªéåæãããã¯ãŒã¯ã¿ã¹ã¯ã®éä¿¡ãšã¢ã«ãŠã³ãã£ã³ã°ã«é¢äžããŠããŸãã ãŸããããŒã¹URLãããããŒã®æšæºã»ãããªã©ã®äžè¬çãªãµãŒããŒAPIããŒã¿ãä¿åããŸãã
- å¿çåŠçãããã³ã«ã ãã®ãããã³ã«ã¯ãããŒã¿ã¹ããªãŒã ïŒãã©ãŒããããããJSONãå«ãïŒãåä¿¡ãããããã¢ããªã±ãŒã·ã§ã³ãç解ã§ããæ§é ãŸãã¯ããŒã¿ã¢ãã«ã«å€æã§ãããå³å¯ã«åæå®ããããšã³ãã£ãã£ïŒ ããŒãµãŒããŸãã¯ãã³ãã©ãŒ ïŒãäœæããæ©èœãæäŸããŸãïŒä»¥äžã«ã€ããŠïŒã
- ããŒã¿ã¢ãã«ã ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç解å¯èœã§äŸ¿å©ãªããŒã¿æ§é ã ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã«é©åãã圢åŒã§ãµãŒããŒããŒã¿ãåæ ãããã®ã§ãã
- ããŒãµãŒããŸãã¯å¿çãã³ãã©ãŒã çããŒã¿ãããŒã¿ã¢ãã«ã«ããŸãã¯ãã®éã«å€æãããšã³ãã£ãã£ã å¿çåŠçãããã³ã«ãå®è£
ããŸãã
- ãµãŒãã¹ããŸãã¯ããŒã¿ã¢ã¯ã»ã¹ããŒãã è«ççã«é¢é£ããæäœã®ã°ã«ãŒãã®ç®¡çãã«ãã»ã«åããŸãã ããšãã°ãAuthServiceãUserServiceãProfileServiceãªã©ã
ãªã³ã¯ãå€ãããããã«æããå Žå-æåã¯ç§ãããæããŸããã ãããŸã§ã®ãšãããèšèšããããããã¯ãŒã¯ã³ã¢ãååãšããŠäžè¶³ããŠããããã€ãã®ãããžã§ã¯ãã¯è©ŠããŠããŸããã æ確ãªæ§é ããªããšããµãŒããŒãžã®5ã10ã®ãªã¯ãšã¹ãã®å®è£ åŸãã³ãŒããç¡ç§©åºã®ãŸãŸã«ãããšãã³ãŒãã¯ããã«æ··ä¹±ã«å€ããå§ããŸãã ç¹°ãè¿ããŸãããç§ã¯ã¢ãããŒãã®1ã€ã ããææ¡ããŸãããçŸæç¹ã§ã¯ããããžã§ã¯ãã«åãçµãäžã§æã䟿å©ãªã®ã¯åœŒã§ãã
ããããããããããã«ãå³ã«ããã»ã¹å šäœãåæ ããŸããïŒç»åã¯ã¯ãªãã¯å¯èœã§ãïŒã
ã«ãŒãã«å®è£
è¡ãã ãã¬ã€ã°ã©ãŠã³ããäœæããåã®ã»ã¯ã·ã§ã³ã®æé ã«çŽæ¥é²ã¿ãŸãã ããã«ãã»ãšãã©ã®å Žåãç§ã®ãµãŒããŒã¯JSONãè¿ããŸãã ã©ã®JSONããŒãµãŒã䜿çšãããã¯ããªãã®è£éã§ãããå·çæç¹ã§ã¯åã³ãèšèªã®ç¬¬3ããŒãžã§ã³ã«é©åããã©ã€ãã©ãªã¯ãªãã£ãã®ã§ãç§ã¯èªäœã®GJSONããŒãµãŒã䜿çšããŸããã
ãšã©ãŒæ å ±
ããã§ã¯ãã¹ãŠãéåžžã«åæ©çã§ãããããã€ãã®ãã£ãŒã«ããšã€ãã·ã£ã©ã€ã¶ãæã€ã¯ã©ã¹ã§ãã ã¿ã¹ã¯ã®ãã¬ãŒã ã¯ãŒã¯ã§ãããå®æãããæ¡åŒµããå¿ èŠã¯ãããŸããïŒãã¡ããããããžã§ã¯ãã§ã¯ããã¯ç°ãªãå ŽåããããŸãïŒã
ãšã©ãŒæ
å ±
final class ResponseError { let code: NSNumber? let message: String? // MARK: - Root init(json: Any?) { if let obj = GJSON(json) { code = obj.number("code") message = obj.string("message") } else { code = nil message = nil } } }
åçæ å ±
ããå°ã詳现ãªã¯ã©ã¹ãååã¯åãã§ãã ãã®å ŽåããµãŒããŒã«ãã£ãŠè¿ãããå¿çã«ã察å¿ããŸããããã¯ããã€ããªå ¥åããŒã¿ãå¿çã³ãŒãããªãã·ã§ã³ã®ã¡ãã»ãŒãž+解æãšã©ãŒã§ãã
åçæ
å ±
final class Response { let data: Any? let code: NSNumber? let message: String? let error: ResponseError? // MARK: - Root init?(json: Any?) { guard let obj = GJSON(json) else { return nil } code = obj.number("code") message = obj.string("message") data = json error = ResponseError(json: json) } }
ãããžã§ã¯ãã®å©äŸ¿æ§ã®ããã«ãè¿ããããã€ããªããŒã¿ã§JSONã䜿çšããããšãä¿èšŒãããŠããå Žåãããšãã°ãjsonããŒãµãŒãè¿ããã£ãŒã«ããè¿œå ãããªã©ãæ¡åŒµã«ãã£ãŠãã®ã¯ã©ã¹ãæ¡åŒµã§ããŸãã
䟿å®äžã®æ¡åŒµ
extension Response { var parser: GJSON? { return GJSON(data) } }
éåæãããã¯ãŒã¯ã¿ã¹ã¯
ããã¯ãã§ã«ã¯ããã«èå³æ·±ãããšã§ãã ãã®ã¯ã©ã¹ã®ç®çã¯ãè¿ããããã¹ãŠã®ããŒã¿ãåä¿¡ãããã¹ãŠã®ããŒã¿ãããã³ãã®ã¹ããŒã¿ã¹ïŒå®äº/ãã£ã³ã»ã«ïŒãä¿åããããšã§ãã ãŸããèªèº«ããããã¯ãŒã¯ã«éä¿¡ããäœæ¥ã®å®äºåŸã«ã³ãŒã«ããã¯ãåŒã³åºãæ¹æ³ãç¥ã£ãŠããŸãã ãµãŒããŒããã®å¿çãåä¿¡ãããšãåŸç¶ã®åŠçãç°¡çŽ åããããã«ãå¯èœã§ããã°ãå ¥åããŒã¿ãJSONãªããžã§ã¯ãã«å€æããè©Šã¿ãå«ããåä¿¡ãããã¹ãŠã®ããŒã¿ãæžãçããŸãã ãŸããå°æ¥çã«ã¯Setã»ããå ã§ãã®ãããªã¿ã¹ã¯ã®ã»ããã䜿çšãããããããã€ãã®ã·ã¹ãã ãããã³ã«ãå®è£ ããå¿ èŠããããŸãã
éåæãããã¯ãŒã¯ã¿ã¹ã¯
typealias DataTaskCallback = (DataTask) -> () final class DataTask: Hashable, Equatable { let taskId: String let request: URLRequest let session: URLSession private(set) var responseObject: Response? private(set) var response: URLResponse? private(set) var error: Error? private(set) var isCancelled = false private(set) var isCompleted = false private var task: URLSessionDataTask? // MARK: - Root init(taskId: String, request: URLRequest, session: URLSession = URLSession.shared) { self.taskId = taskId self.request = request self.session = session } // MARK: - Controls func start(callback: DataTaskCallback?) { task = session.dataTask(with: request) { [unowned self] (data, response, error) in if self.isCancelled { return } self.isCompleted = true // transform if possible var wrappedData: Any? = data if data != nil { if let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) { wrappedData = json } } // parse self.responseObject = Response(json: wrappedData) self.error = error // callback callback?(self) } task?.resume() } func cancel(callback: DataTaskCallback?) { if task != nil && !isCompleted && !isCancelled { isCancelled = true task?.cancel() // callback callback?(self) } } // MARK: - Equatable static func ==(lhs: DataTask, rhs: DataTask) -> Bool { return lhs.taskId == rhs.taskId } // MARK: - Hashable var hashValue: Int { return taskId.hashValue } }
ã¿ã¹ã¯ããŒã«
åè¿°ã®ããã«ããã®ã¯ã©ã¹ã¯ã¢ã¯ãã£ããªéåæã¿ã¹ã¯ã远跡ããŸããããã¯ãåæããããã°ã«åœ¹ç«ã¡ãŸãã ããŒãã¹ãšããŠãã¿ã¹ã¯ãèå¥åã§æ€çŽ¢ããããšãã°ãã£ã³ã»ã«ããããšãã§ããŸãã ã¿ã¹ã¯ããŒã«ãä»ããŠããã¹ãŠã®ã¿ã¹ã¯ããããã¯ãŒã¯ã«éä¿¡ãããŸãïŒãããã䜿çšããªãããšãã§ããŸãããã¿ã¹ã¯ãèªåã§ã©ããã«ä¿åããå¿ èŠããããããŸã䟿å©ã§ã¯ãããŸããïŒã ãã¡ãããã¯ã©ã¹ãã·ã³ã°ã«ãã³ã«ããŸãã
ã¿ã¹ã¯ããŒã«
final class TaskPool { static let instance = TaskPool() // singleton let session = URLSession.shared // default session let baseURLString = "https://myserver.com/api/v1/" // default base URL var defaultHeaders: [String: String] { // default headers list return ["Content-Type": "application/json"] } private(set) var activeTasks = Set<DataTask>() // MARK: - Root private init() { } // forbid multi-instantiation // MARK: - Controls func send(task: DataTask, callback: DataTaskCallback?) { // check for existing task if taskById(task.taskId) != nil { print("task with id \"\(task.taskId)\" is already active.") return } // start activeTasks.insert(task) print("start task \"\(task.taskId)\". URL: \(task.request.url!.absoluteString)") task.start { [unowned self] (task) in self.activeTasks.remove(task) print("task finished \"\(task.taskId)\". URL: \(task.request.url!.absoluteString)") callback?(task) } } func send(taskId: String, request: URLRequest, callback: DataTaskCallback?) { let task = DataTask(taskId: taskId, request: request, session: session) send(task: task, callback: callback) } func taskById(_ taskId: String) -> DataTask? { return activeTasks.first(where: { (task) -> Bool in return task.taskId == taskId }) } }
ãããã³ã«
ãããŠããããã¯ãŒã¯ã³ã¢ã«çŽæ¥é¢é£ããæåŸã®éšåã¯ãå¿çåŠçã§ãã èšèªã®å³å¯ãªã¿ã€ãã³ã°ã«ãããç¬èªã®èª¿æŽãè¡ãããŸãã ããŒãµãŒã¯ã©ã¹ã§ããŒã¿ãåŠçããAnyïŒã§ã¯ãªãç¹å®ã®ããŒã¿åãæå®ããå¿ èŠããããŸãã ãããã®ç®çã®ããã«ãå°ããªæ±çšãããã³ã«ãäœæããããã«å®è£ ããŸãã
ãããã³ã«
protocol JSONParser { associatedtype ModelType func parse(json: Any?) -> ModelType? }
次ã¯ïŒ
å®éãããã§ãããã¯ãŒã¯ã³ã¢ã®äœæã¯å®äºã§ãã ããã¯ããããžã§ã¯ãéã§ç°¡åã«è»¢éã§ãããµãŒããŒAPIã¢ãã¬ã¹ã ãã§ãªããåçãšãšã©ãŒã«é¢ããæ å ±ã®æ§é ããããã«å容ããã ãã§ãã
ãã®èšäºã®ç¬¬2éšã§ã¯ãææ¡ãããã¢ãŒããã¯ãã£ã®å©ç¹ãæ倧åããããã«ããããžã§ã¯ãã§äœæããããããã¯ãŒã¯ã³ã¢ã䜿çšããæ¹æ³ãèŠãŠãããŸãã