2016년 10월 11일 화요일

Alamofire 소스 분석 - 1

Alamofire 소스 분석해보기.

1. http://happyhourguide.blogspot.kr/2016/10/uiimaveview-extension.html
2. http://happyhourguide.blogspot.kr/2016/10/alamofire-2.html
3. http://happyhourguide.blogspot.kr/2016/12/alamofire-queue.html

https://github.com/Alamofire/Alamofire

* 사용자의 URL 입력을 내부에서 사용하기 위한 형태로 변환하기
url의 형태로 다음의 타입을 사용할 수 있다: String, NSURL, NSURLComponents, NSURLRequest. 이들은 모두 URLStringConvertible을 구현하고 있다. URLRequest 함수를 통해 앞의 타입을 NSMutableURLRequest(내부에 NSURL을 가지고 있는다)로 변환한다. ParameterEncoding.swift의 encode함수를 통해 url을 서버에 보내기 위한 형태로 변환한다. encode 함수는 URLRequestConvertible을 파라메터로 받는다.
URLStringConvertible -> NSMutableRequest -> URLRequestConvertible

- Alamofire.swift
request, upload, download의 함수를 통해 서버에 HTTP 요청을 할 수 있다. Manager를 통해 작업이 이루어진다. 리턴은 Request.
URLStringConvertible과 URLRequestConvertible을 정의한다.

- Manager.swift
Alamofire에서 사용되는 글로벌한 인스턴스를 가지고 있다.
NSURLSessionConfiguration: 기본 session configuration과 기본 헤더 값(Accept-Encoding, Accept-Language, User-Agent)으로 초기화.
SessionDelegate: session에 대한 delegate
생성시 NSURLSession 초기화하고 종료시 invalidateAndCancel()을 통해 실행중이던 테스크들을 정리한다.

사용자가 backgroundCompletionHandler를 통해 서버 요청이 끝났을 때 실행될 내용을 등록할 수 있다.(sessionDidFinishEventsForBackgroundURLSession에 handler를 등록, dispatch_async(dispatch_get_main_queue())를 통해 메인 쓰레드에서 동작하도록 한다.)

- ParameterEncoding.swift
parameter를 percent encoding하고 이를 URL request에 적용한다.
URL, URLEncodedInURL, JSON, PropertyList, Custom의 다섯가지 방법이 있다.
(URLEncodedInURL은 URL과 같이 인코딩을 하나 항상 url의 뒤에 붙인다.)
encode로 인코딩을 시작하고 queryComponents로 key/value를 나누고 escape로 percent-escaped string으로 바꾼다.

URL의 경우 method가 GET, HEAD, DELETE이면 parameter를 url의 뒤에 붙이고 아니면 body에 넣는다. body에 넣을 때는 헤더에 "Content-Type: application/x-www-form-urlencoded; charset=utf-8"도 같이 추가해 준다.
JSON의 경우 NSJSONSerialization을 사용하고 "Content-Type: application/json"을 헤더에 넣는다.
PropertyList의 경우 NSPropertyListSerialization을 사용하고 "Content-Type: application/x-plist"를 헤더에 넣는다.
Custom은 사용자가 직접 인코딩을 처리하도록 한다.

인코딩의 경우 다음과 같은 예가 있다:
parameter에서 key가 array일 경우는 다음처럼 바꾼다: ?key[]=value1&key[]=value2
nested key를 가지고 있는 경우는 다음처럼 바꾼다: ?key[k1]=value1&key[k2]=value2

percent-escaping에 string.stringByAddingPercentEncodingWithAllowedCharacters를 사용한다.



댓글 없음:

댓글 쓰기

Building asynchronous views in SwiftUI 정리

Handling loading states within SwiftUI views self loading views View model 사용하기 Combine을 사용한 AnyPublisher Making SwiftUI views refreshable r...