포스트

챌린지반 과제 (5)

Token 적용해보기.

검색을 하다가 Header를 통해 Token을 적용할 수 있다고 하여 해보려고 한다.

되는지 안되는지는 페이징 테스트 여러번 해보면 될것같다.

깃 공식사이트에 헤더를 사용하라고 되어있긴한데 어떻게 적용할지 몰라서 검색을 많이 했다.

그러다 사이트 를 발견하고 이렇게 헤더를 그냥 쓰면 되겠구나 해서 해보려 한다.

let headers: HTTPHeaders = ["Authorization": "Bearer Token"] 하나 만들어 준다.

저기 토큰은 각자 알아서.

1
        AF.request(url, method: .get, headers: headers)

이런식으로 뒤에 헤더만 더 넣어준다.

동작테스트

simulator-screenshot-707-E4368-DA02-426-E-AE26-53-E0-F7-B2-BEE9

우선은 잘 나온다.

헤더가 잘 되는지 토큰값을 변경하고 테스트를 해본다.

Clean-Shot-2024-04-02-at-02-06-17-2x

바로 에러가난다.

다시 토큰값을 원복시키고 실행 하니 잘 된다.

즉 헤더가 제대로 먹힌다는 것이다.

endpage 일때 페이징 멈추기

1
2
3
4
5
6
7
8
9
10
11
12
13
func addPage () {
        let currentCount = repoList.count

        if hasNext {
            currentPage += 1
            gitManager.fetchRequestAppleRepo(page: currentPage, hasNext: hasNext)
            isLoadingPage = false
            
            if currentCount > 290 { // 전체 로딩개수가 기준을 넘어가면 false
                hasNext = false
            }
        }
    }

현재는 290개 일때 멈추게 되어있다.

이건 repository의 개수를 알기에 강제로 세팅이 가능했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
func addPage () {
        let currentCount = repoList.count

        if isHasNext {
            currentPage += 1
            gitManager.fetchRequestAppleRepo(page: currentPage, hasNext: isHasNext)
            isLoadingPage = false
            
            if currentCount > 290 { // 전체 로딩개수가 기준을 넘어가면 false
                isHasNext = false
            }
        }
    }

이젠 알아서 boolean값을 바꾸게 한번 해보자.

1
2
3
4
5
6
7
8
9
10
11
if !decodedData.isEmpty {
                        do {
                            for data in decodedData {
                                let list = GitRepoModel(name: data.name, html_url: data.html_url, language: data.language)
                                self.repoLists.append(list)
                            }
                            self.delegate?.sendRepo(data: self.repoLists)
                        }
                    } else {
                        
                    }

우선 값을 받아올때 더이상 페이지를 가져오지않는 페이지에 도달했을때의 조건을 주기위해 isEmpty를 사용했다.

1
2
3
4
5
protocol SendProfile {
    func sendData (data: [GitModel])
    func sendRepo (data: [GitRepoModel])
    func sendNext (hasNext: Bool)
}

그리고 프로토콜에 하나 더 전달하기위해 sendNext를 사용했다.

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
func fetchRequestAppleRepo (page: Int, hasNext: Bool) {
        
        if hasNext {
            let appleURL = "https://api.github.com/users/apple/repos?page="
            
            AF.request(appleURL+String(page), method: .get, headers: header).responseDecodable(of: [GitRepoModel].self
            ) { response in
                switch response.result {
                case .success(let decodedData) :
                    if !decodedData.isEmpty {
                        do {
                            for data in decodedData {
                                let list = GitRepoModel(name: data.name, html_url: data.html_url, language: data.language)
                                self.repoLists.append(list)
                            }
                            self.delegate?.sendRepo(data: self.repoLists)
                            self.delegate?.sendNext(hasNext: true)
                        }
                    } else {
                        self.delegate?.sendNext(hasNext: false)
                    }
                case .failure(let error) :
                    print(error.localizedDescription)
                }
            }
        }
    }

그리고 다음과 같이 delegate를 통해 전달하게 하고,

1
2
3
func sendNext(hasNext: Bool) {
        isHasNext = hasNext
    }

위와 같은 함수를 통해 받게하였다.

Apr-02-2024-11-30-44

하지만 문제는 한번더 내려줬을때 빈배열을 확인하고 더이상 로드를 하지않게 하는것이라서 근본적인 문제 해결은 아니었다.

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
func fetchRequestAppleRepo (page: Int, hasNext: Bool) {
        
        if hasNext {
            let appleURL = "https://api.github.com/users/apple/repos?page="
            
            AF.request(appleURL+String(page), method: .get, headers: header).responseDecodable(of: [GitRepoModel].self
            ) { response in
                switch response.result {
                case .success(let decodedData) :
                    if !decodedData.isEmpty {
                        if decodedData.count == 30 {
                            do {
                                for data in decodedData {
                                    let list = GitRepoModel(name: data.name, html_url: data.html_url, language: data.language)
                                    self.repoLists.append(list)
                                }
                                self.delegate?.sendRepo(data: self.repoLists)
                                self.delegate?.sendNext(hasNext: true)
                            }
                        } else {
                            do { // 30개가 아닐때
                                for data in decodedData {
                                    let list = GitRepoModel(name: data.name, html_url: data.html_url, language: data.language)
                                    self.repoLists.append(list)
                                }
                                self.delegate?.sendRepo(data: self.repoLists)
                                self.delegate?.sendNext(hasNext: false)
                            }
                        }
                    } else {
                        self.delegate?.sendNext(hasNext: false)
                    }
                case .failure(let error) :
                    print(error.localizedDescription)
                }
            }
        }
    }

그래서 한페이지 당 30개의 값을 가져오기에, 마지막이 30개가 아닐때로 한번더 세분화를 해주었다.

Apr-02-2024-11-32-51

더이상 로드를 하지 않게 되었다.

해결

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