
çŸåšãã¢ããªã±ãŒã·ã§ã³ã®ã»ãŒ100ïŒ
ããããã¯ãŒã¯ã䜿çšããŠããããã誰ãããããã¯ãŒã¯å±€ã®çµç¹ãšäœ¿çšã«çŽé¢ããŠããŸãã ãã®åé¡ã解決ããã«ã¯ãäž»ã«2ã€ã®ã¢ãããŒãããããŸãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšãããããããã¯ãŒã¯å±€ã®ç¬èªã®å®è£
ã§ãã ãã®èšäºã§ã¯ã2çªç®ã®ãªãã·ã§ã³ãæ€èšãããããã³ã«ãšåæã䜿çšããŠãèšèªã®ãã¹ãŠã®ææ°æ©èœã䜿çšããŠãããã¯ãŒã¯å±€ã®å®è£
ãè©Šã¿ãŸãã ããã«ããããããžã§ã¯ããäžèŠãªäŸåé¢ä¿ããè¿œå ã©ã€ãã©ãªã®åœ¢ã§ä¿åãããŸãã MoyaãèŠãããšããã人ã¯ãå®è£
ãšäœ¿çšã®å€ãã®åæ§ã®è©³çŽ°ãããã«èªèããŸãããä»åã ãã¯ãMoyaãšAlamofireã«è§Šããã«èªåã§ãããè¡ããŸãã
ãã®ã¬ã€ãã§ã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããã«ãçŽç²ãªSwiftã«ãããã¯ãŒã¯å±€ãå®è£
ããæ¹æ³ã説æããŸãã ãã®èšäºã確èªãããšãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
- ãããã³ã«æå
- 䜿ãããã
- 䜿ãããã
- ã¿ã€ãã»ãŒã
- ãšã³ããã€ã³ãã«ã¯åæåã䜿çšãããŸã
以äžã¯ããããã¯ãŒã¯å±€ã®äœ¿çšãå®è£
åŸã«ã©ã®ããã«èŠãããã®äŸã§ãã
router.requestã®ã¿ã
èšè¿°ããããšã«ãã
ïŒããã³åæã®ãã¹ãŠã®åã䜿çšããŠãå¯èœãªèŠæ±ãšãã®ãã©ã¡ãŒã¿ãŒã®ãã¹ãŠã®ãªãã·ã§ã³ã衚瀺ãããŸãã
ãŸãããããžã§ã¯ãã®æ§é ã«ã€ããŠå°ãäœãæ°ãããã®ãäœæãããšãã¯ãã€ã§ãããŸãå°æ¥ãã¹ãŠãç°¡åã«ç解ã§ããããã«ããããã«ã¯ããã¹ãŠãæ£ããæŽçããŠæ§æããããšãéåžžã«éèŠã§ãã é©åã«ç·šæããããã©ã«ããŒæ§é ã¯ãã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ãæ§ç¯ããéã®éèŠãªè©³çŽ°ã§ãããšèããŠããŸãã ãã¹ãŠããã©ã«ãã«é©åã«é
眮ããããã«ãäºåã«äœæããŸãããã ããã¯ããããžã§ã¯ãã®äžè¬çãªãã©ã«ããŒæ§é ã®ããã«ãªããŸãã
Endpointtypeãããã³ã«ãŸãã
EndPointTypeãããã³ã«ãå®çŸ©ããå¿
èŠã
ãããŸãã ãã®ãããã³ã«ã«ã¯ãèŠæ±ãæ§æããããã«å¿
èŠãªãã¹ãŠã®æ
å ±ãå«ãŸããŸãã ãªã¯ãšã¹ãïŒãšã³ããã€ã³ãïŒãšã¯äœã§ããïŒ æ¬è³ªçã«ã¯ãããããŒããªã¯ãšã¹ããã©ã¡ãŒã¿ããªã¯ãšã¹ãæ¬æãªã©ã®ãã¹ãŠã®é¢é£ã³ã³ããŒãã³ããå«ãURLRequestã§ãã
EndPointTypeãããã³ã«ã¯ããããã¯ãŒã¯å±€å®è£
ã®æãéèŠãªéšåã§ãã ãã¡ã€ã«ãäœæããŠ
EndPointTypeãšããååãä»ããŸãããã ãã®ãã¡ã€ã«ãServiceãã©ã«ããŒã«é
眮ããŸãïŒEndPointãã©ã«ããŒã§ã¯ãªããçç±-å°ãåŸã§æããã«ãªããŸãïŒ
HTTPãããã³ã«EndPointTypeã«ã¯ããªã¯ãšã¹ããäœæããããã«å¿
èŠãªããã€ãã®ãããã³ã«ãå«ãŸããŠããŸãã ãããã®ãããã³ã«ãäœã§ãããèŠãŠã¿ãŸãããã
HTTPMethodãã¡ã€ã«ãäœæãã
HTTPMethodãšããååãä»ããŠãServiceãã©ã«ããŒã«é
眮ããŸãã ãã®ãªã¹ãã¯ããªã¯ãšã¹ãã®HTTPã¡ãœãããèšå®ããããã«äœ¿çšãããŸãã
HTTPTaskãã¡ã€ã«ãäœæãã
HTTPTaskãšããååãä»ããŠãServiceãã©ã«ããŒã«é
眮ããŸãã HTTPTaskã¯ãç¹å®ã®èŠæ±ã®ãã©ã¡ãŒã¿ãŒãæ§æãã圹å²ãæãããŸãã å¿
èŠã«å¿ããŠããŸããŸãªã¯ãšãªãªãã·ã§ã³ãè¿œå ã§ããŸãããä»åºŠã¯éåžžã®ã¯ãšãªããã©ã¡ãŒã¿ãŒãå«ãã¯ãšãªããã©ã¡ãŒã¿ãŒãšããããŒãå«ãã¯ãšãªãäœæãããããããã3çš®é¡ã®ã¯ãšãªã®ã¿ãå®è¡ããŸãã

次ã®ã»ã¯ã·ã§ã³ã§ã¯ã
ãã©ã¡ãŒã¿ãšãããã®æäœæ¹æ³ã«ã€ããŠèª¬æããŸã
HTTPHeadersHTTPHeadersã¯èŸæžã®åãªãã¿ã€ããšã€ãªã¢ã¹ã§ãã
HTTPTaskãã¡ã€ã«ã®äžéšã§äœæã§ããŸãã
public typealias HTTPHeaders = [String:String]
ãã©ã¡ãŒã¿ãšãšã³ã³ãŒããã¡ã€ã«ãäœæãã
ParameterEncodingãšããååãä»ããŠãEncodingãã©ã«ããŒã«é
眮ããŸãã
Parametersã® typealiasãäœæããŸããããã¯åã³éåžžã®èŸæžã«ãªããŸãã ããã¯ãã³ãŒããããç解ããããèªã¿ãããããããã§ãã
public typealias Parameters = [String:Any]
次ã«ãåäžã®ãšã³ã³ãŒãé¢æ°ã§
ParameterEncoderãããã³ã«ãå®çŸ©ããŸãã encodeã¡ãœããã«ã¯ã
inout URLRequestãš
Parametersã® 2ã€ã®ãã©ã¡ãŒã¿ãŒããããŸãã
INOUTã¯ãé¢æ°ãã©ã¡ãŒã¿ãŒãåç
§ãšããŠå®çŸ©ããSwiftããŒã¯ãŒãã§ãã éåžžããã©ã¡ãŒã¿ãŒã¯å€ãšããŠé¢æ°ã«æž¡ãããŸãã åŒã³åºãã®é¢æ°ãã©ã¡ãŒã¿ãŒã®åã«
inoutãèšè¿°ããå Žåããã®ãã©ã¡ãŒã¿ãŒãåç
§åãšããŠå®çŸ©ããŸãã inoutåŒæ°ã®è©³çŽ°ã«ã€ããŠã¯ããã®ãªã³ã¯ããã©ãããšãã§ããŸãã ã€ãŸãã
inoutã䜿çšãããšããã©ã¡ãŒã¿ãŒã§å€ãååŸããŠé¢æ°å
ã§æäœããã ãã§ãªããé¢æ°ã«æž¡ãããå€æ°èªäœã®å€ãå€æŽã§ããŸãã
ParameterEncoderãããã³ã«ã¯
JSONParameterEncoderããã³
URLPameterEncoderã«å®è£
ãããŸãã
public protocol ParameterEncoder { static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws }
ParameterEncoderã«ã¯ã
ãã©ã¡ãŒã¿ãŒããšã³ã³ãŒãããããšãã¿ã¹ã¯ã§ããåäžã®é¢æ°ãå«ãŸããŠããŸãã ãã®ã¡ãœããã¯åŠçãå¿
èŠãªãšã©ãŒãã¹ããŒããå¯èœæ§ããããããthrowã䜿çšããŸãã
ãŸããæšæºãšã©ãŒã§ã¯ãªããã«ã¹ã¿ãã€ãºããããšã©ãŒãçæãããšäŸ¿å©ãªå ŽåããããŸãã XcodeãæäŸãããã®ã解èªããããšã¯åžžã«éåžžã«å°é£ã§ãã ãã¹ãŠã®ãšã©ãŒãã«ã¹ã¿ãã€ãºããŠèª¬æãããšãäœãèµ·ãã£ãããåžžã«æ£ç¢ºã«ææ¡ã§ããŸãã ãããè¡ãã«ã¯ã
Errorããç¶æ¿ããåæãå®çŸ©ããŸãããã

ãã¡ã€ã«ãäœæãã
URLParameterEncoderãšããååãä»ããŠã
ãšã³ã³ãŒããã©ã«ããŒã«é
眮ããŸãã

ãã®ã³ãŒãã¯ãã©ã¡ãŒã¿ãŒã®ãªã¹ããåãåããURLãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããããã«å€æããã³ãã©ãŒãããããŸãã ãåç¥ã®ããã«ãäžéšã®æåã¯URLã§èš±å¯ãããŠããŸããã ãã©ã¡ãŒã¿ãŒããïŒãèšå·ã§åºåãããŠãããããããã«æ³šæããå¿
èŠããããŸãã ãªã¯ãšã¹ãã§ããããŒãèšå®ãããŠããªãå Žåã¯ãããããŒã®ããã©ã«ãå€ãèšå®ããå¿
èŠããããŸãã
ããã¯ãåäœãã¹ãã§ã«ããŒãããããšã«ãªã£ãŠããã³ãŒãã®äžéšã§ãã URLãªã¯ãšã¹ããäœæããããšãéèŠã§ããããããªããšãå€ãã®äžèŠãªãšã©ãŒãçºçããå¯èœæ§ããããŸãã ãªãŒãã³APIã䜿çšããå Žåã倱æãããã¹ãã«å¯ŸããŠå¯èœãªéãå€ãã®ãªã¯ãšã¹ãã䜿çšããããªãããšã¯æããã§ãã åäœãã¹ãã«ã€ããŠè©³ããç¥ãããå Žåã¯ããã®èšäºããå§ããŠãã ããã
JSONParameterEncoderãã¡ã€ã«ãäœæãã
JSONParameterEncoderãšããååãä»ããŠããšã³ã³ãŒããã©ã«ããŒã«é
眮ããŸãã

ãã¹ãŠã
URLParameterã®å Žåãšåãã§ããããã§ã¯ãJSONã®ãã©ã¡ãŒã¿ãŒãå€æãããšã³ã³ãŒããapplication / jsonããå®çŸ©ãããã©ã¡ãŒã¿ãŒãããããŒã«å床远å ããŸãã
ãããã¯ãŒã¯ã«ãŒã¿ãŒãã¡ã€ã«ãäœæãã
NetworkRouterãšããååãä»ããŠãServiceãã©ã«ããŒã«é
眮ããŸãã ã¯ããŒãžã£ã®ã¿ã€ããšã€ãªã¢ã¹ãå®çŸ©ããããšããå§ããŸãããã
public typealias NetworkRouterCompletion = (_ data: Data?,_ response: URLResponse?,_ error: Error?)->()
次ã«ã
NetworkRouterãããã³ã«ãå®çŸ©ããŸãã
NetworkRouterã«ã¯ãªã¯ãšã¹ãã«äœ¿çšãã
EndPointããã ããªã¯ãšã¹ããå®äºãããšããã«ããã®ãªã¯ãšã¹ãã®çµæã
NetworkRouterCompletionã¯ããŒãžã£ãŒã«æž¡ãããŸãã ãã®ãããã³ã«ã«ã¯
ãã£ã³ã»ã«æ©èœããããããã䜿çšããŠé·æã®ããŒãããã³ã¢ã³ããŒãèŠæ±ãäžæã§ããŸãã
Routerã
EndPointTypeã®ä»»æã®ã¿ã€ã
ããµããŒãããããã«ãããã®ã§ãããã§ã
relatedtypeã䜿çšããŸãã ã relatedtypeã䜿çšããªããšãã«ãŒã¿ãŒã«ã¯
EndPointTypeãå®è£
ããç¹å®ã®ã¿ã€ããå¿
èŠã«ãªã
ãŸã ã relatedtypeã«ã€ããŠè©³ããç¥ãããå Žåã¯ã
ãã®èšäºãèªãããšãã§ããŸãã
ã«ãŒã¿ãŒãã¡ã€ã«ãäœæãã
Routerãšããååãä»ããŠServiceãã©ã«ããŒã«å
¥ããŸãã
URLSessionTaskåã®ãã©ã€ããŒãå€æ°ã宣èšããŸãã ãã¹ãŠã®äœæ¥ãããã«ãªããŸãã å€éšã«èª°ãå€æŽã§ããªãããã«ãããããéå
¬éã«ããŸãã
ãªã¯ãšã¹ãããã§ã¯ã
URLSession.sharedã䜿çšããŠ
URLSessionãäœæããŸãããããæãç°¡åãªäœææ¹æ³ã§ãã ãããããã®æ¹æ³ãå¯äžã®ãã®ã§ã¯ãªãããšãå¿ããªãã§ãã ããã ããè€éãªæ§æ
URLSessionã䜿çšãããšããã®åäœãå€æŽã§ããŸãã 詳现ã«ã€ããŠã¯ã
ãã®èšäºãã芧
ãã ãã ã
buildRequesté¢æ°ãåŒã³åºãããšã§èŠæ±ãäœæãããŸã
buildRequestå
ã®ãšã³ã³ãŒãé¢æ°ãäŸå€ãã¹ããŒããå¯èœæ§ããããããé¢æ°åŒã³åºãã¯do-try-catchã«ã©ãããããŠããŸãã
å¿ç ã
ããŒã¿ãããã³
ãšã©ãŒãå®äºã«æž¡ãããŸãã
ãã«ããªã¯ãšã¹ãbuildRequesté¢æ°ã䜿çšããŠãªã¯ãšã¹ããäœæããŸãã ãã®æ©èœã¯ããããã¯ãŒã¯å±€ã§ã®ãã¹ãŠã®éèŠãªäœæ¥ãæ
åœããŸãã åºæ¬çã«
EndPointTypeã
URLRequestã«å€æã
ãŸã ã ãããŠã
EndPointããªã¯ãšã¹ãã«å€ãããšããã«ãããã
sessionã«æž¡ãããšãã§ããŸãã ããã§å€ãã®ããšãèµ·ãã£ãŠããã®ã§ãã¡ãœãããèŠãŠã¿ãŸãããã ãŸãã
buildRequestã¡ãœããã調ã¹ãŠ
ã¿ãŸããã ã
1.
URLRequestãªã¯ãšã¹ãå€æ°ãåæåããŸãã ãã®äžã«ããŒã¹URLãèšå®ããããã«äœ¿çšãããç¹å®ã®ãªã¯ãšã¹ãã®ãã¹ãè¿œå ããŸãã
2.
request.httpMethodã« EndPointããhttpã¡ãœãããå²ãåœãŠ
ãŸã ã
3.ãšã³ã³ãŒããŒããšã©ãŒãã¹ããŒããå¯èœæ§ããããããdo-try-catchãããã¯ãäœæããŸãã 1ã€ã®å€§ããªdo-try-catchãããã¯ãäœæããããšã«ãããè©Šè¡ããšã«åå¥ã®ãããã¯ãäœæããå¿
èŠããªããªããŸãã
4.ã¹ã€ããã§ã
route.taskã確èªã
ãŸã ã
5.ã¿ã¹ã¯ã®ã¿ã€ãã«å¿ããŠã察å¿ãããšã³ã³ãŒããŒãåŒã³åºããŸãã
ãã©ã¡ãŒã¿ãæ§æããã«ãŒã¿ãŒã§
configureParametersé¢æ°ãäœæã
ãŸã ã

ãã®é¢æ°ã¯ãã¯ãšãªãã©ã¡ãŒã¿ã®å€æãè¡ããŸãã APIã¯JSON圢åŒã®
bodyParametersãšURL圢åŒã«å€æããã
URLParametersã®äœ¿çšãæ³å®ããŠãããããé©åãªãã©ã¡ãŒã¿ãŒã察å¿ããå€æé¢æ°ã«æž¡ãã ãã§ããããã«ã€ããŠã¯èšäºã®åé ã§èª¬æããŸããã ããŸããŸãªã¿ã€ãã®ãšã³ã³ãŒããå«ãAPIã䜿çšããå Žåããã®å Žåããšã³ã³ãŒãã¿ã€ãã®è¿œå åæã
䜿çšããŠ
HTTPTaskãè¿œå ããããšããå§ãããŸãã ãã®ãªã¹ãã«ã¯ãå¯èœãªãã¹ãŠã®ã¿ã€ãã®ãšã³ã³ãŒããå«ãŸããŠããå¿
èŠããããŸãã ãã®åŸãconfigureParametersã§ããã®åæã«ãã1ã€ã®åŒæ°ãè¿œå ããŸãã ãã®å€ã«å¿ããŠãswitchã䜿çšããŠåãæ¿ããå¿
èŠãªãšã³ã³ãŒããè¡ããŸãã
è¿œå ã®ããããŒãè¿œå ã«ãŒã¿ãŒã§
addAdditionalHeadersé¢æ°ãäœæããŸãã

å¿
èŠãªããããŒããã¹ãŠãªã¯ãšã¹ãã«è¿œå ããã ãã§ãã
ãã£ã³ã»ã«ãããã£ã³ã»ã«æ©èœã¯éåžžã«ã·ã³ãã«ã«èŠããŸãïŒ
䜿çšäŸããã§ã¯ãå®éã®äŸã䜿çšããŠãããã¯ãŒã¯å±€ã䜿çšããŠã¿ãŸãããã
TheMovieDBã«æ¥ç¶ããŠãã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ãåä¿¡ããŸãã
MovieEndPointMovieEndPointãã¡ã€ã«ãäœæããEndPointãã©ã«ããŒã«é
眮ããŸãã MovieEndPointã¯æ¬¡ãšåãã§ã
Moyaã®TargetTypeã ããã§ã¯ã代ããã«ç¬èªã®EndPointTypeãå®è£
ããŸãã åæ§ã®äŸã§Moyaã䜿çšããæ¹æ³ã説æããèšäºã¯ã
ãã®ãªã³ã¯ã«ãããŸãã
import Foundation enum NetworkEnvironment { case qa case production case staging } public enum MovieApi { case recommended(id:Int) case popular(page:Int) case newMovies(page:Int) case video(id:Int) } extension MovieApi: EndPointType { var environmentBaseURL : String { switch NetworkManager.environment { case .production: return "https:
æ ç»ã¢ãã«MovieModelããã³JSONããŒã¿ã¢ãã«ã解æããŠã¢ãã«ã«ããã«ã¯ãDecodableãããã³ã«ã䜿çšããŸãã ãã®ãã¡ã€ã«ã
Modelãã©ã«ããŒã«é
眮ããŸãã
泚 ïŒCodableãDecodableãããã³Encodableãããã³ã«ã®è©³çŽ°ã«ã€ããŠã¯
ãä»ã®èšäºãåç
§ããŠãã ããããããã®ãããã³ã«ã䜿çšãããã¹ãŠã®æ©èœã«ã€ããŠè©³ãã説æããŠããŸãã
import Foundation struct MovieApiResponse { let page: Int let numberOfResults: Int let numberOfPages: Int let movies: [Movie] } extension MovieApiResponse: Decodable { private enum MovieApiResponseCodingKeys: String, CodingKey { case page case numberOfResults = "total_results" case numberOfPages = "total_pages" case movies = "results" } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: MovieApiResponseCodingKeys.self) page = try container.decode(Int.self, forKey: .page) numberOfResults = try container.decode(Int.self, forKey: .numberOfResults) numberOfPages = try container.decode(Int.self, forKey: .numberOfPages) movies = try container.decode([Movie].self, forKey: .movies) } } struct Movie { let id: Int let posterPath: String let backdrop: String let title: String let releaseDate: String let rating: Double let overview: String } extension Movie: Decodable { enum MovieCodingKeys: String, CodingKey { case id case posterPath = "poster_path" case backdrop = "backdrop_path" case title case releaseDate = "release_date" case rating = "vote_average" case overview } init(from decoder: Decoder) throws { let movieContainer = try decoder.container(keyedBy: MovieCodingKeys.self) id = try movieContainer.decode(Int.self, forKey: .id) posterPath = try movieContainer.decode(String.self, forKey: .posterPath) backdrop = try movieContainer.decode(String.self, forKey: .backdrop) title = try movieContainer.decode(String.self, forKey: .title) releaseDate = try movieContainer.decode(String.self, forKey: .releaseDate) rating = try movieContainer.decode(Double.self, forKey: .rating) overview = try movieContainer.decode(String.self, forKey: .overview) } }
ãããã¯ãŒã¯ãããŒãžã£ãŒManagerãã©ã«ããŒã«
NetworkManagerãã¡ã€ã«ãäœæããŸãã çŸåšãNetworkManagerã«ã¯2ã€ã®éçããããã£ã®ã¿ãå«ãŸããŠããŸããAPIããŒãšãæ¥ç¶ãããµãŒããŒã®ã¿ã€ããèšè¿°ããåæã§ãã
NetworkManagerã«ã¯ãã¿ã€ã
MovieApiã® ã«ãŒã¿ãŒãå«ãŸããŠããŸãã
ãããã¯ãŒã¯å¿çNetworkManagerã§
NetworkResponseåæãäœæããŸãã

èŠæ±ãžã®å¿çãåŠçãããšãã«ãã®åæã䜿çšãã察å¿ããã¡ãã»ãŒãžã衚瀺ããŸãã
çµæNetworkManagerã§
çµæåæãäœæããŸãã
çµæã䜿çšããŠããªã¯ãšã¹ããæåãããã©ãããå€æããŸãã ããã§ãªãå Žåã¯ãçç±ãšãšãã«ãšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã
èŠæ±å¿çåŠçhandleNetworkResponseé¢æ°ãäœæããŸãã ãã®é¢æ°ã¯ã
HTTPResponseãªã©ã®1ã€ã®åŒæ°ã
åãã Resultãè¿ããŸãã

ãã®é¢æ°ã§ã¯ãHTTPResponseããåãåã£ãstatusCodeã«å¿ããŠããšã©ãŒã¡ãã»ãŒãžãŸãã¯æåãããªã¯ãšã¹ãã®ãµã€ã³ãè¿ããŸãã éåžžã200..299ã®ç¯å²ã®ã³ãŒãã¯æåãæå³ããŸãã
ãããã¯ãŒã¯èŠæ±ãè¡ãããã§ããããã¯ãŒã¯å±€ã®äœ¿çšãéå§ããããã«ãã¹ãŠãè¡ããŸããããªã¯ãšã¹ããäœæããŠã¿ãŸãããã
æ°ããæ ç»ã®ãªã¹ãããªã¯ãšã¹ãããŸãã é¢æ°ãäœæãã
getNewMoviesãšããååã
ä»ããŸãã

æé ãèŠãŠã¿ãŸãããã
1.
getNewMoviesã¡ãœããã2ã€ã®åŒæ°ã§å®çŸ©ããŸããããŒãžããŒã·ã§ã³ããŒãžçªå·ãšã
ã ãŒããŒã¢ãã«ã®ãªãã·ã§ã³ã®é
åãŸãã¯ãªãã·ã§ã³ã®ãšã©ãŒãè¿ãå®äºãã³ãã©ãŒã§ãã
2.
ã«ãŒã¿ãŒãåŒã³åºããŸãã ã¯ããŒãžã£ãŒã§ããŒãžçªå·ãšããã»ã¹
å®äºãæž¡ããŸãã
3.ãããã¯ãŒã¯ããªãå ŽåããŸãã¯äœããã®çç±ã§ãªã¯ãšã¹ããéä¿¡ã§ããªãã£ãå Žåã
URLSessionã¯ãšã©ãŒãè¿ããŸãã ããã¯APIãšã©ãŒã§ã¯ãªãããšã«æ³šæããŠãã ããããã®ãããªãšã©ãŒã¯ã¯ã©ã€ã¢ã³ãã§çºçããéåžžã¯ã€ã³ã¿ãŒãããæ¥ç¶ã®å質ãäœãããã«çºçããŸãã
4.
statusCodeããããã£ã«ã¢ã¯ã»ã¹ããå¿
èŠãããããã
å¿çã
HTTPURLResponseã«ãã£ã¹ãããå¿
èŠããããŸãã
5.
çµæã宣èšãã
handleNetworkResponseã¡ãœããã䜿çšããŠåæåãã
6.
æåãšã¯ããªã¯ãšã¹ããæåããäºæ³ãããå¿çãåãåã£ãããšãæå³ããŸãã 次ã«ãããŒã¿ã«çããä»ããŠãããã©ããã確èªãããªãå Žåã¯ãreturnã䜿çšããŠã¡ãœãããçµäºããŸãã
7.åçã«ããŒã¿ãå«ãŸããŠããå Žåãåä¿¡ããããŒã¿ãã¢ãã«ã«è§£æããå¿
èŠããããŸãã ãã®åŸãçµæã®ã¢ãã«ã®é
åãå®äºã«æž¡ããŸãã
8.ãšã©ãŒãçºçããå Žåã¯ãåã«ãšã©ãŒã
å®äºã«æž¡ããŸãã
ããã ãã§ãããããããµãŒãããŒãã£ã®ããããã©ã€ãã©ãªã®åœ¢ã§äŸåé¢ä¿ã䜿çšããã«ãçŽç²ãªSwiftã§ç¬èªã®ãããã¯ãŒã¯å±€ãåäœããæ¹æ³ã§ãã ãã£ã«ã ã®ãªã¹ããååŸããããã®ãã¹ãAPIãªã¯ãšã¹ããäœæããã«ã¯ã
NetworkManagerããããã£ã䜿çšããŠ
MainViewControllerãäœæãããããä»ããŠ
getNewMoviesã¡ãœãããåŒã³åºããŸãã
class MainViewController: UIViewController { var networkManager: NetworkManager! init(networkManager: NetworkManager) { super.init(nibName: nil, bundle: nil) self.networkManager = networkManager } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .green networkManager.getNewMovies(page: 1) { movies, error in if let error = error { print(error) } if let movies = movies { print(movies) } } } }
å°é¡ããŒãã¹ç¹å®ã®å Žæã§ã©ã®ãããªãã¬ãŒã¹ãã«ããŒã䜿çšãããŠããã®ãç解ããŠããªããšãã«ãXcodeã®ç¶æ³ããããŸãããïŒ ããšãã°ã
ã«ãŒã¿ãŒçšã«äœæããã°ããã®ã³ãŒããèŠãŠãã ããã
NetworkRouterCompletionãèªåã§æ±ºå®ããŸããããããã§ããã®ã¿ã€ããšãã®äœ¿çšæ¹æ³ãå¿ããã¡ã§ãã ããããç§ãã¡ã®ææã®Xcodeããã¹ãŠãåŠçãããã¬ãŒã¹ãã«ããŒãããã«ã¯ãªãã¯ããã ãã§ååã§ãXcodeãç®çã®ã¿ã€ãã眮ãæããŸãã
ãããã«ããã§ãããã³ã«æåã®ãããã¯ãŒã¯å±€ã®å®è£
ãã§ããŸãããããã¯éåžžã«äœ¿ããããããã€ã§ãããŒãºã«åãããŠã«ã¹ã¿ãã€ãºã§ããŸãã ãã®æ©èœãšããã¹ãŠã®ã¡ã«ããºã ã®ä»çµã¿ãç解ããŸããã
ãã®ãªããžããªã§ãœãŒã¹ã³ãŒããèŠã€ããããšãã§ã
ãŸã ã