이번 주차는 네트워크에 대해서 강의를 듣고 스터디를 진행했다
강의 내용에 언급한 alamofire의 multipart통신을 하고 싶었지만 시간이 나지 않아서 못 했다,,,
multipart 통신은 다음 블로그로 올리도록 하고
오늘은 통신, 특히 alamofire에 대해 공부해 보았다.
: HTTP란 한 마디로 HTML(웹 문서를 만들기 위한 언어) 문서를 주고 받는데 쓰이는 통신 프로토콜(통신규약)이며, TCP/UDP(전송 계층에서 사용하는 프로토콜)를 사용하여 통신한다.
(더 자세한 내용은 따로 공부 해서 블로그를 작성하도록 하겠다)
보통 GET, POST, PATCH, DELETE 4개가 주로 사용된다.
: http 통신을 하기 위해 사용되는 라이브러리
iOS에서 네트워킹은 기본적으로 URLSession을 사용한다.
이때, 프로젝트의 복잡도가 높아지고 추상화 되면 URLSession 위에 구현된 Alamofire 방식을 활용하게 된다.
통신을 하기 위해선 API 명세서가 필요하다
어떤 url로 통신하며 어떻게 가져오는지에 대한 정보가 나와 있다
각각의 기능의 통신 방법, url 양식 등을 볼 수 있다
func getUserFeed(_ viewController: ProfileViewController,
_ userID: Int = 2) {
//통신
AF.request("https://edu-api-ios-test.softsquared.com/users/\(userID)",
method: .get,
parameters: nil)
.validate()
.responseDecodable(of: UserFeedModel.self) { response in
switch response.result{
case .success(let result):
print("조회 성공")
viewController.successFeedAPI(result)
case .failure(let error):
print(error.localizedDescription)
}
}
}
Request: 주소 넣기
Validate: 확인 코드
ResponseDecodable(of: ): 정보를 받는 부부이며, of: 부분에 decodable 한 struct 파일을 받는다
이후 후행 클로저를 통해 reponse 핸들링을 해준다
→ success와 failure로 구분 후, result 값 활용
처음 함수를 만들 때, viewcontroller를 함수 인자로 받고
통신에 성공했을 때 result를 해당 뷰컨의 successAPI()에 넘겨주어서 이벤트를 처리한다.
request에 대한 response가 어떤 파일 형태로 전달 되는지 확인 후, 그에 맞게 swift struct를 짜준다.
하단의 struct는 json을 표현하기 위해 Decodable Type을 사용했다.
import Foundation
// MARK: - Welcome
struct UserFeedModel:Decodable {
let isSuccess: Bool?
let code: Int?
let message: String?
let result: Result?
}
// MARK: - Result
struct Result: Decodable {
let isMyFeed: Bool?
let getUserInfo: GetUserInfo?
let getUserPosts: [GetUserPost]?
}
// MARK: - GetUserInfo
struct GetUserInfo: Decodable {
let userIdx: Int?
let nickName, name: String?
let profileImgURL: String?
let website: String?
let introduction: String?
let followerCount, followingCount, postCount: Int?
}
// MARK: - GetUserPost
struct GetUserPost: Decodable{
let postIdx: Int?
let postImgUrl: String?
}
private func setupData() {
UserFeedDataManager().getUserFeed(self)
}
원하는 위치에서 데이터 매니저 내의 함수를 호출한다(통신 한다)
//API 통신 메소드
extension ProfileViewController {
func successFeedAPI(_ result: UserFeedModel) {
self.userPosts = result.result?.getUserPosts
}
func successDeletePostAPI(_ isSuccess: Bool) {
guard isSuccess else {return}
if let deletedIndex = self.deletedIndex {
self.userPosts?.remove(at: deletedIndex)
}
}
}
받아 온 result를 활용해 미리 정의해 놓은 변수에 통신해서 받아온 정보를 저장하는 등의 로직을 수행한다.
통신에 성고해서 받아 온 정보를 화면에 표시할 때는 꼭 reload 시켜줘야 한다.
var userPosts : [GetUserPost]? {
didSet {
self.profileCollectionView.reloadData()
}
}
didsSe을 활용해 값이 바뀔 때마다 자동으로 reload 하도록 설정.