Unsplash API를 사용해서 URLSession 데이터 fetch, upload 코드를 작성했습니다.
자세한 내용은 노션 블로그 글에서 보실 수 있습니다.
Version | |
---|---|
main | [23/05/19] 네트워크 통신을 위한 Swift Package Library를 추가했습니다. MTNetwork로 네트워크 통신 해보기 |
version/230516 | URLSession 뜯어보기 - URLSessionConfiguration 사용, 네트워크 코드 공통화 시키기 |
version/230505 | URLSession 뜯어보기 - Shared Session 사용해서 데이터 보내고 받아보기 |
하단의 내용은 [version/230516]에서 볼 수 있습니다.
현재 브랜치에는 네트워크 코드를 공통화하여 동일한 코드가 반복되지 않게끔 했습니다. 하단에 있는 네트워크 코드들을 더 쉽고 간편하게 사용할 수 있습니다.
private func fetchImages() {
Task {
do {
let response = try await PhotoAPI().fetchImages(perPage: 3, orderBy: "popular")
if let data = response.data {
DispatchQueue.main.async {
self.imageURLs = data.compactMap { $0.urls?.regular }
}
} else {
self.handleError("데이터가 들어오지 않았습니다.")
}
} catch NetworkError.decodingError {
self.handleError("데이터 디코딩에 실패했습니다.")
} catch NetworkError.clientError(let message) {
self.handleError(message ?? "")
} catch NetworkError.serverError {
self.handleError("서버에 문제가 발생하였습니다.")
}
}
}
더 자세한 내용은 Networks
폴더를 참고해주세요.
두 API를 사용해서 화면에 사진과 collection 목록을 띄워줍니다.
shared session dataTask
메소드로 사진을 가져와서 completion handler를 사용해서 응답 데이터를 받습니다.
private func fetchImages() {
var url = URL(string: "https://api.unsplash.com/photos")!
url.append(queryItems: [
URLQueryItem(name: "per_page", value: "20"),
URLQueryItem(name: "order_by", value: "popular")
])
var urlRequest = URLRequest(url: url)
urlRequest.allHTTPHeaderFields = ["Authorization": "\(KeyProvider.appKey(of: .clientId))"]
let task = URLSession.shared.dataTask(with: urlRequest) { data, response, error in
// ...
}
task.resume()
}
default session dataTask
메소드로 콜렉션 목록을 가져와서 URLSessionDataDelegate 안에 있는 메서드를 통해서 응답 데이터를 받습니다.
private func fetchCollections() {
let session: URLSession = {
let configuration = URLSessionConfiguration.default
configuration.waitsForConnectivity = true
return URLSession(configuration: configuration,
delegate: self, delegateQueue: nil)
}()
let url = URL(string: "https://api.unsplash.com/collections")!
var urlRequest = URLRequest(url: url)
urlRequest.allHTTPHeaderFields = ["Authorization": "\(KeyProvider.appKey(of: .clientId))"]
let task = session.dataTask(with: urlRequest)
task.resume()
}
// MARK: - URLSessionDataDelegate
extension ViewController: URLSessionDataDelegate {
func urlSession(_ session: URLSession,
dataTask: URLSessionDataTask,
didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
// ...
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
// ...
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
// ...
}
}
API를 사용해서 Collection를 생성합니다.
shared session upload
메소드로 title, description, private 값을 메시지 바디에 보내어 콜렉션을 생성합니다.
completion handler를 사용해서 응답 데이터를 받습니다.
private func uploadCollection(_ collection: CollectionRequestDTO) {
guard let data = self.encodeCollection(collection) else { return }
let task = URLSession.shared.uploadTask(with: self.urlRequest, from: data) { data, response, error in
// ...
}
task.resume()
}