<aside> 🔨 DDD 3기 프로젝트 [팀 구성] 5인 (Server 1, iOS 2, Designer 2)
</aside>
[2019. 10 ~ 2020. 02]
위시리스트 앱 서비스 WishBall (미완)https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a1437214-1361-4f98-8a12-3ed2e96a0eb9/Slider_Animation__keyboard_Tool_bar.mov
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/094e7a94-3ee9-4abc-85bb-7ac4c38b8b1d/Magnetic_Animation.mov
Network 코드 간결화
<aside> 💡 HttpMethod, StatusCode를 enum으로 만들어 networking을 해야할 때 중복되는 코드들을 줄여 가독성과 간결한 코드를 만들 수 있게 됨. 다만 피드백으로 networkManager()와 같은 클래스로 모든 Network 관련 메소드들을 묶어서 캡슐화 한다면 더 좋은 코드가 될 수 있다는 이야기를 받음!
</aside>
enum HttpMethod: String {
case get = "GET"
case post = "POST"
case put = "PUT"
case delete = "DELETE"
case patch = "PATCH"
var value: String {
return rawValue
}
}
enum StatusCode {
case success
case fail
case serverError
}
private func networking(method: HttpMethod, contentType: ContentType, url: URL, data: Data, completion: @escaping(Data?, URLResponse?, Error?) -> Void) -> StatusCode {
var statusCode: Int = 400
let semaphore = DispatchSemaphore(value: 0)
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.value
if contentType == .multipartFormData {
urlRequest.setValue("multipart/form-data; boundary=\\(UUID().uuidString)", forHTTPHeaderField: "Content-Type")
}else {
urlRequest.setValue(contentType.value, forHTTPHeaderField: "Content-Type")
}
urlRequest.setValue(UserDefaults.standard.string(forKey: "accessToken"), forHTTPHeaderField: "Authorization")
urlRequest.httpBody = data
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: urlRequest) { (data, response, error) in
if let httpResponse = response as? HTTPURLResponse {
statusCode = httpResponse.statusCode
} else {
print("no response")
completion(data, response, error)
}
completion(data, response, error)
semaphore.signal()
}
dataTask.resume()
semaphore.wait()
switch statusCode {
case 200...299:
return .success
case 400...499:
return .fail
default:
return .server
}
}
private let baseURL = WishBallAPI().serverAddress
/// 아이템 전체 조회
func requestWishItems(completion: @escaping(Wish) -> Void) -> StatusCode {
guard let url = URL(string: baseURL + WishBallAPI().wishItems) else {
return .fail
}
let statusCode = networking(method: .get, contentType: .applicationJson, url: url, data: Data()) { (data, response, error) in
if let data = data, let jsonData = try? JSONDecoder().decode(Wish.self, from: data) {
print("Get WishItems API == \\(jsonData)")
completion(jsonData)
}
}
return statusCode
}