나의 발자취

KakaoAPI를 활용한 BookSearch 앱 만들기 (2) 본문

앱 개발/iOS

KakaoAPI를 활용한 BookSearch 앱 만들기 (2)

달모드 2024. 9. 9. 21:41

 

지난 포스팅:

2024.09.06 - [앱 개발/iOS] - KakaoAPI를 활용한 BookSearch 앱 만들기 (1)

 

KakaoAPI를 활용한 BookSearch 앱 만들기 (1)

Kakao API를 통해, 책 검색 API를 사용해 검색한 키워드대로 책 목록을 가져오고, 목록을 클릭하면 상세 화면으로 넘어가 책에 대한 상세 내용을 웹뷰로 띄워줄것이다. func search()먼저 Kakao API로 책

wildguess.tistory.com

 

 

 

저번 포스팅과 같이 코드를 작성하면 시뮬레이터에 위와 같은 화면밖에 보이지 않는다. 그 이유는 Delegate 를 해주는 tableView에게, 데이터를 호출해서 재가공한 시점에서 새로 생성했다고 알려줘야한다.

그러나 아래와 같이 reloadData()를 하면 에러가 난다.

// Data 형식 바뀌는 시점 -> tableView에게 알려줘야함
self.documents = root["documents"] as? [[String:Any]]
// 이렇게 하면 에러남
Self.tableView.reloadData()

 

 

그렇다면?

GCD(Grand Central Dispatch)를 알아야한다.

  • 멀티쓰레드/디스패치큐/메인큐 - 글로벌큐

키워드가 나올 예정이다.

 

출처:

 

UI 변경은 메인큐에서밖에 못하는데, 지금 시간이 걸리는 작업들은 모두 Global Queue에서 돌아가고 있다.

MainQueue

- 유일함

- Main Thread 에서 처리함

- Serial Queue

 

GlobalQueue

- Quality of Service(QoS) 따라 6개로 구분

- Concurrent Queue

CustomQueue

 

<6개로 구분>

 DispatchQoS.userInteractive

- 애니메이션 또는 UI 업데이트에 사용

 DispatchQoS.userInitiated

- API에서 데이터를 로드하는 것과 같은 작업에 사용

 DispatchQoS.default

- 기본적인 작업에 사용

 DispatchQoS.utility

- 사용자가 추적할 필요가 없는 작업에 사용

 DispatchQoS.background

- 로컬 데이터베이스에 데이터를 저장하거나 우선 순위가 높지 않은 유지 관리 코드와 같은 작업에 사용

 DispatchQoS.unspecified

 

따라서 현재 로드한 데이터는 Global Queue에서 작업되고 있는데, Search Bar 로 UI랑 통신하니까 이것을 Main Queue로 옮겨와야 한다.

 

self.documents = root["documents"] as? [[String:Any]]
                
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }

 

 

그리고 실행

 

썸네일 이미지 불러오기

// book thumbnail
        if let thumbnail = book["thumbnail"] as? String { // guard-let 쓰면 return cell을 못하니까 전체가 다 안나옴.
            if let url = URL(string: thumbnail) {
                let request = URLRequest(url: url)
                let task = URLSession.shared.dataTask(with: request) { data, response, error in
                    if let data {
                        DispatchQueue.main.async {
                            imageView?.image = UIImage(data: data)
                        }
                    }
                } // handler
                task.resume()
            }
        }

 

task.resume() 빼먹지말기!!!!

 

 

버튼 구현

 

상세페이지 구현

 

 

 

 

Comments