나의 발자취
KakaoAPI를 활용한 BookSearch 앱 만들기 (2) 본문
지난 포스팅:
2024.09.06 - [앱 개발/iOS] - KakaoAPI를 활용한 BookSearch 앱 만들기 (1)
저번 포스팅과 같이 코드를 작성하면 시뮬레이터에 위와 같은 화면밖에 보이지 않는다. 그 이유는 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() 빼먹지말기!!!!
버튼 구현
상세페이지 구현
'앱 개발 > iOS' 카테고리의 다른 글
XCode에서 마크다운 형식 보는법 - 단축키 한번에 (0) | 2024.09.11 |
---|---|
API 결과값 안에 tag가 있을 때 - Regex (0) | 2024.09.10 |
KakaoAPI를 활용한 BookSearch 앱 만들기 (1) (3) | 2024.09.06 |
WebView: alert 만들기 (파일명: WebNativeCom) (9) | 2024.09.05 |
Xcode 주석 종류 (0) | 2024.09.05 |