챌린지반 과제 (5)
Token 적용해보기.
검색을 하다가 Header를 통해 Token을 적용할 수 있다고 하여 해보려고 한다.
되는지 안되는지는 페이징 테스트 여러번 해보면 될것같다.
깃 공식사이트에 헤더를 사용하라고 되어있긴한데 어떻게 적용할지 몰라서 검색을 많이 했다.
그러다 사이트 를 발견하고 이렇게 헤더를 그냥 쓰면 되겠구나 해서 해보려 한다.
let headers: HTTPHeaders = ["Authorization": "Bearer Token"]
하나 만들어 준다.
저기 토큰은 각자 알아서.
1
AF.request(url, method: .get, headers: headers)
이런식으로 뒤에 헤더만 더 넣어준다.
동작테스트
우선은 잘 나온다.
헤더가 잘 되는지 토큰값을 변경하고 테스트를 해본다.
바로 에러가난다.
다시 토큰값을 원복시키고 실행 하니 잘 된다.
즉 헤더가 제대로 먹힌다는 것이다.
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
}
위와 같은 함수를 통해 받게하였다.
하지만 문제는 한번더 내려줬을때 빈배열을 확인하고 더이상 로드를 하지않게 하는것이라서 근본적인 문제 해결은 아니었다.
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개가 아닐때로 한번더 세분화를 해주었다.
더이상 로드를 하지 않게 되었다.
해결
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.