지금까지 모든 프로젝트에서 API통신을 URLSession을 통해 진행해 왔다
가장 큰 이유는 네이티브로 어떻게 작동이 되는지 모르는데 라이브러리만 떡칠한다면 분명 나중에 큰일이 생길 것이라는 생각때문에...
그렇기도 하고 크게 필요성을 느끼지 못했었다
그런데 지금 회사에서 API통신을 Alamofire로 하고 있어 이에대한 숙지가 필요해 스터디를 진행했는데 이게 왠걸... 완전 신세계다
func request<T: Decodable>(api:APIable, resultType: T.Type, completion: @escaping (Result<T, APIError>) -> Void) {
let baseURL = api.host + api.path //URL string 만들기
let request = AF.request(baseURL, method: api.method, parameters: api.params) //baseURL + httpMethod + parameters로 request만들기
request.responseDecodable(of: resultType) { result in //responseDecodable을 이용해 요청과 decoding 진행하기
guard result.error == nil else {
completion(.failure(APIError.transportError))
return
}
guard let response = result.response, (200...299).contains(response.statusCode) else {
completion(.failure(APIError.responseError))
return
}
guard let data = result.value else {
completion(.failure(APIError.dataError))
return
}
completion(.success(data))
}
}
그냥 위 코드 하나로 끝났다
baseURL만들어주기 -> 그 URL + HTTPMethod + parameters를 넘겨줘서 request 만들기
(현재 HTTPMethod와 parameter들은 APIable이라는 객체의 프로퍼티로 있음)
request에서 responseDecodable을 호출해 data를 어떤 타입으로 반환할지 of에 작성하고 result에 대한 체크를 한 뒤 completion으로 넘겨주었다
물론, 이 과정을 async/await와 결합해 사용할 수 있지만 그건 다음 시간에...
AF의 responseDecodable이라는 메서드를 사용했는데 스레드에 대한 설정을 해준 적이 없는데 지 알아서 비동기로 작동하고 뷰 업데이트도 잘 된다
queue
라는 매개변수를 받고 있으며 이건 기본값으로 main을 사용하고 있음responseDecodable
이라는 메서드를 통해 decoding까지 한번에 가능해 decode를 위한 객체나 코드를 생성할 필요가 없다