728x90
Alamofire는 HTTP 네트워킹을 하는데 자주 사용하게 되는 코드나 함수를 더 쉽게 사용할 수 있도록 모아놓은 라이브러리
Alamore란 iOS, macOS를 위한 Swift 기반의 HTTP 네트워킹 라이브러리Alamofire는 URLSession 기반이며 URLSession은 네트워킹 호출에서 모호한 부분이 많은데 Alamofire를 사용한다면 데이터를 접근하기 위한 노력을 줄일 수 있으며 코드를 더 깔끔하고 가독성 있게 쓰는 것이 가능해짐
URLSession
iOS에서 기본적으로 제공하고 있는 HTTP통신 방법은 여러가지가 있지만 URLSession을 이용한 방법이 대표적.
- URLSession은 URLSessionConfiguration을 이용하여 생성을 하게 된다.
- URLSession 여러개의 URLSessionTask를 만들수 있다. 이 URLSessionTask로 실제 통신을 하게 된다.
- URLSession Delegate을 통해서 네트워크 중간과정을 확인할 수 있다. 필수는 아님.
URLSessionConfiguration을 만들 때는 3가지 타입분류로 나뉜다.
- Default : 기본 통신
- Ephemeral : 쿠키나 캐시를 저장하지 않게 할 때 ( private모드랑 비슷 )
- Background : 앱이 백그라운드에 있을 때, 컨텐츠 다운로드 등등 할 때
URLSessionTask도 3가지 작업으로 나뉨
- URLSessionDataTask : 간단한 데이터를 받아올때 ( 백그라운드에서 진행은 안됨)
- URLSessionUploadTask : 파일을 업로드할 때 씀.
- URLSessionDownloadTask : 다운도르 할 때 씀.
- URLComponuents를 이용하여 직접 넣어주기
- URLQueryItem : 각각의 컴포넌트 접근 or 한국어,띄어쓰기 같은 글이 있을 경우 못알아들을 수 있음 자동인코딩해줌.
- URLSession 이용해보기 => URLSessionConfiguration, URLSession - dataTask 이용
=> 위의 받아진 내용포스트맨으로 확인하기
단점: 이런식의 코드는 가독성은 물론이며, 조금의 설정만 바꾸면 많은 것이 변경하여야함 => 이러한 불편한 것들을 개선시키는 라이브러리인 Alamofire를 사용하면 편하다.
결론 : Alamofire를 쓰자
전체 코드
import UIKit
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
let mediaQuery = URLQueryItem(name: "media", value: "music")
let entityQuery = URLQueryItem(name: "entity", value: "song")
let termQuery = URLQueryItem(name: "term", value: "지드래곤")
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)
let requestURL = urlComponents.url!
struct Response: Codable {
let resultCount: Int
let tracks: [Track]
enum CodingKeys: String, CodingKey {
case resultCount
case tracks = "results"
}
}
struct Track: Codable {
let title: String
let artistName: String
let thumbnailPath: String
enum CodingKeys: String, CodingKey {
case title = "trackName"
case artistName
case thumbnailPath = "artworkUrl100"
}
}
let dataTask = session.dataTask(with: requestURL) { (data, response, error) in
guard error == nil else { return }
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return }
let successRange = 200..<300
guard successRange.contains(statusCode) else {
// handle response error
return
}
guard let resultData = data else { return }
let resultString = String(data: resultData, encoding: .utf8)
do {
let decoder = JSONDecoder()
let response = try decoder.decode(Response.self, from: resultData)
let tracks = response.tracks
print("--> tracks: \(tracks.count) -\(String(describing: tracks.first?.title)), \(tracks.last?.thumbnailPath ?? "")")
} catch let error {
print("---> error: \(error.localizedDescription)")
}
// print("---> result : \(resultString)")
}
dataTask.resume()
728x90
반응형
'🌙 iOS 스터디 > iOS' 카테고리의 다른 글
[iOS] 스레드와 DispatchQueue (0) | 2021.05.19 |
---|---|
[iOS] Firebase 파이어베이스 (0) | 2021.03.12 |
[ios] 비동기 (Async) vs 동기 (Sync) 와 직렬 vs 동시처리 (0) | 2021.02.24 |
[xcode] 유용한 단축키 모음 ( - 지속적 업데이트 중) (0) | 2021.01.19 |
[xcode] extension 언제 사용? (0) | 2021.01.19 |