çŸåšãã¢ããªã±ãŒã·ã§ã³ã®ã»ãŒ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çš®é¡ã®ã¯ãšãªã®ã¿ãå®è¡ããŸãã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ã ãã©ã¡ãŒã¿ãšãããã®æäœæ¹æ³ã«ã€ããŠèª¬æããŸã
HTTPHeaders
HTTPHeadersã¯èŸæžã®åãªãã¿ã€ããšã€ãªã¢ã¹ã§ãã 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ã«æ¥ç¶ããŠãã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ãåä¿¡ããŸãã
MovieEndPoint
MovieEndPointãã¡ã€ã«ãäœæãã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://api.themoviedb.org/3/movie/" case .qa: return "https://qa.themoviedb.org/3/movie/" case .staging: return "https://staging.themoviedb.org/3/movie/" } } var baseURL: URL { guard let url = URL(string: environmentBaseURL) else { fatalError("baseURL could not be configured.")} return url } var path: String { switch self { case .recommended(let id): return "\(id)/recommendations" case .popular: return "popular" case .newMovies: return "now_playing" case .video(let id): return "\(id)/videos" } } var httpMethod: HTTPMethod { return .get } var task: HTTPTask { switch self { case .newMovies(let page): return .requestParameters(bodyParameters: nil, urlParameters: ["page":page, "api_key":NetworkManager.MovieAPIKey]) default: return .request } } var headers: HTTPHeaders? { return nil } }
æ ç»ã¢ãã«
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ãç®çã®ã¿ã€ãã眮ãæããŸãã
ãããã«
ããã§ãããã³ã«æåã®ãããã¯ãŒã¯å±€ã®å®è£ ãã§ããŸãããããã¯éåžžã«äœ¿ããããããã€ã§ãããŒãºã«åãããŠã«ã¹ã¿ãã€ãºã§ããŸãã ãã®æ©èœãšããã¹ãŠã®ã¡ã«ããºã ã®ä»çµã¿ãç解ããŸããã
ãã®ãªããžããªã§ãœãŒã¹ã³ãŒããèŠã€ããããšãã§ããŸã ã