포스트

챌린지반 과제 FeedBack

FeedBack 내용

내용은 아래와 같다.

  1. iOS 미니멈 버전 요구사항을 맞춰주세요
  2. 컨밴션을 맞춰주세요
  3. 사용하지 않는 함수는 삭제해주세요.
  4. DispatchGroup 적용해보기.
  5. Model에 CodingKey 적용하여 카멜형식으로 수정해주세요.
  6. 수정이 되지 않는 변수는 let으로 변경해주세요.
  7. GitModel 다시 생성하는 부분을 수정해주세요.
  8. gitList는 Array 형식이 아니여도 좋을거 같아요.

1. iOS 미니멈 버전 요구사항을 맞춰주세요

코드를 제출하고 어제 챌린지반 강의 수강하면서 아차 싶었던 부분이다.

미니멈 버전의 요구사항은 15였다.

CleanShot 2024-04-13 at 00 00 18@2x

버전을 바꾸니 다음과 같은 에러가 발생했다.

1
Compiling for iOS 15.0, but module 'Alamofire' has a minimum deployment target of iOS 17.0

Alamofire의 버전을 현재 ios의 최신버전으로 사용하면서 생긴 문제로 생각한다.

CleanShot 2024-04-13 at 00 04 18@2x

Clear!

2. 컨벤션을 맞춰주세요

이건 내가 너무 코드작성에만 신경을 써서 놓친 부분같다.

우선 나머지 먼저 진행하는걸로.

3. 사용하지 않는 함수는 삭제해주세요.

이걸 튜터님이랑 같이 코드를 보면서 알게되었다.

왜 만들었나 싶다. 뭔가 페이징처리하면서 이것저것 시도하면서 생긴게 아닐까라는 생각이 든다.

과제제출한지 10일이 지난 시점이라 기억이 정확하게 나지 않는다.

해당 코드를 지우면서 이것도 Clear!

1
2
3
override func viewDidAppear(_ animated: Bool) {
        
    }

4. DispatchGroup 적용해보기.

1
2
3
4
5
6
7
8
9
func loadPage () {
        isLoadingPage = true // 로드가 되는동안에는 true로 하여 브레이크를 준다 dispatchQueue 실행 전에 더 내려서 발생하는 함수 재호출 방지
        DispatchQueue.main.async { // 섹션 1을 로딩
            self.tableView.reloadSections(IndexSet(integer: 1), with: .none)
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { // 1초뒤 실행, 무분별한 로딩을 방지
            self.addPage()
        }
    }

여기에 DispatchQueue가 두번 들어갔는데 이부분에 대해서 DispatchGroup을 사용해야한다.

5. Model에 CodingKey 적용하여 카멜형식으로 수정해주세요.

이것역시 튜터님 강의를 보면서 아차싶었던 부분이다.

바로 적용해보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Before
struct GitModel : Codable {
    
    var login : String 
    var name : String 
    var avatar_url : String // CamelCase 규칙 어김
    var location : String 
    var followers : Int 
    var following : Int 
    
}

struct GitRepoModel: Codable {
    
    var name: String 
    var html_url: String // CamelCase 규칙 어김
    var language: String? 
}

바로 url부분에서 CamelCase를 사용하지 못했다.

그냥 JSON과 똑같은 변수명으로 하면서 놓쳐버린 아주 어이없는Case이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// After
struct GitModel: Codable {
    
    var login : String // id
    var name : String // 이름
    var avatarUrl : String // profile image url
    var location : String // 지역
    var followers : Int // 팔로워 수
    var following : Int // 팔로잉 수
    
    // new!
    enum CodingKeys: String, CodingKey {
        
        case login
        case name
        case avatarUrl = "avatar_url" // avatar_url로 실제 Json과 같은 변수명을 사용.
        case location
        case followers
        case following
        
    }
}

struct GitRepoModel: Codable {
    
    var name: String // repo이름
    var htmlUrl: String // url주소
    var language: String? // repo사용된 언어
    
    enum CodingKeys: String, CodingKey {
        
        case name
        case htmlUrl = "html_url"
        case language
        
    }
    
}

해당부분도 수정완료.

url부분의 변수명이 바뀌면서 관련에러는 그에 맞게 이름만 다시 조정해주면 해결이 된다.

Clear!

6. 수정이 되지 않는 변수는 let으로 변경해주세요.

1
2
3
4
5
6
7
struct Constants {
    
    static var identifier = "RepoCell"
    static var cellName = "RepoTableViewCell"
    static var secondCellName = "LoadingCell"
    
}

너무 어이가 없던 부분이다. let을 써야할 부분에 왜 var를 썼는지 이해가 안간다.

var -> let으로 바꿔주면 끝

Clear!

7. GitModel 다시 생성하는 부분을 수정해주세요.

항상 배열로 넘기다보니 익숙함에 빠져서 어이없는 실수를 한 부분이다.

실제로 이번과제인 WishList에서도 똑같이 하고있었다.

사실 하면서 왜 내가 [0] 의 인덱스 값을 가져와서 하는거지? 라는 의문을 품었는데 그냥 찰나였다.

반성하자.

단일 Data 개념이라 그냥 Model자체로 넘기면 되는 거였는데, 뭔가 내가 잘못 적으면서 어찌저찌 하다가 안에 배열로 감싸면서 넘겼던 기억이 어렴풋이 있다.

1
2
3
4
// before
func sendData (data: [GitModel])
// after
func sendData (data: GitModel?)

프로토콜 내부 전달하던 DataType도 배열을 빼고 GitModel로 넘기게 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func fetchRequest () {
        
        AF.request(url, method: .get, headers: header).responseDecodable(of: GitModel.self
        ) { response in
            
            switch response.result {
            case .success(let data) :
                do {
                    let profileList = GitModel(login: data.login, name: data.name, avatarUrl:  data.avatarUrl, location: data.location, followers: data.followers, following: data.following)
                    
                    self.delegate?.sendData(data: profileList)
                }
            case .failure(let error) :
                print(error.localizedDescription)
            }
        }
    }

profileList가 [GitModel] 이었던것을 GitModel로 바꿔주었다.

8. gitList는 Array 형식이 아니여도 좋을거 같아요.

7번의 내용과 연결되는 부분이다.

1
2
3
4
// Before
var gitList: [GitModel] = [GitModel]()

// After

이렇게 바꿔주었다.

옵셔널인 이유는?

Data를 받지 못하면 nil이 되니까.

삭제한 이유는?

sendData에서 옵셔널 바인딩을 할 것이라서.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func sendData(data: GitModel?) {
        
        if let gitList = data {
            
            DispatchQueue.main.async {
                
                self.profileImageView.kf.setImage(with: URL(string: gitList.avatarUrl)) // kingfisher를 사용하여 image url을 적용
                self.idLabel.text = "User ID : \(gitList.login)"
                self.nameLabel.text = "Name : \(gitList.name)"
                self.regionLabel.text = "Location : \(gitList.location)"
                self.followerLabel.text = "Follower : \(String(gitList.followers))"
                self.followingLabel.text = "Following : \(String(gitList.following))"
                
            }
        } 
    }

기존에 있던 gitList를 옵셔널 바인딩에서 사용할 변수이름으로 바꿔 주었다.

그러다보니 기존에 있던 self부분을 다 지워주었다.

Clear!

4번이 가장 큰 산이다. 더 공부를 하고 추가로 수정하도록 하겠다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.