오늘은 검색 히스토리를 최신순으로 표시하는 방법을 알아보겠습니다.
오늘의 목표
1. searchterm structure생성하기
2. searchterms 할당하기(viewcontroller)
3. UITableViewDataSource프로토콜 작성하기
4. viewdidAppear에 서버에 저장된 검색어 parsing하기
5. 최신순으로 sorting하기
1. searchterm structure 생성
struct SearchTerm: Codable {
let term: String
let timestamp: TimeInterval
}
2. searchterms 할당하기(viewcontroller)
var searchTerms: [SearchTerm] = []
3. UITableViewDataSource프로토콜 작성하기
extension HistoryViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchTerms.count
}
//몇개 가져올거야
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "HistoryCell", for: indexPath) as? HistoryCell else {
return UITableViewCell()
}
cell.searchTerm.text = searchTerms[indexPath.row].term
return cell
}
//가져온 거를 TableViewCell 어떻게 보여줄거야?
}
4. viewdidAppear에 서버에 저장된 검색어 parsing하기
parsing전에... 살펴볼 것은
지난 시간에 서버에 저장했던 realtimedatabas에 value값을 다시 살펴봅니다.
https://accompani-i.tistory.com/164
snapshot.value를 먼저 보면, 우리가 필요한건 term과 timestmap의 배열이 필요하다는 것을 느낄 겁니다.
Parsing시작.
guard let searchHistory = snapshot.value as? [String: Any] else { return }
딕셔너리 형태에서 casting을 하고 보니,
Array형태 안에 Key - Value(Dictionary)가 있는 형태입니다.
Key가 String: Any<- any타입이 dictionary
우리는 Key인 저 ID가 필요가 없으므로 searchHistory.value만 추출해보겠습니다.
key의 value값만 추출했더니
ID(Key값)을 제외한 데이터를 얻어냈습니다만
array안에 value값들이 다시 dictionary 형태로 존재합니다.
value type이 array니까 Array로 감싸줘서 type을 설정해주고 우리가 원하는 JSON type으로 변환합니다.
(정확히 swift object를 json형태로 변환)
JSON으로 변환 한 것을 decoder로 decoding하는데 규칙이 있습니다.
서버에서 내려주는 JSON data는 KEY, Value 형테인데 codable로 만든 모델의 프로퍼티 이름과 같아야합니다. (1의 SearchTerm 프로퍼티)
다시 한번 확인해보면
위의 JSON형태는 Array 안에 Dictionary가 있는 것이고
Dictionary가 표현하는 것이 SearchTerm이라는 것입니다.
그래서 SearchTerm의 Array를(JSON)을 decode하고 싶다 라는 의미입니다.
Array(searchHistory.values)를 searchTerms로 decoding해보겠습니다.
searchTerms parsing
self.searchTerms는 parsing된 searchterms로 할당합니다.
※
storyboard에
TableView가 viewcontroller의 DataSource와 Delegate에 연결됐나 다시 확인해봅니다.
5. 최신순으로 sorting하기
위 목록은 최신순이 아닙니다 최근 검색어는 Friends-Interstella-Notebook-dark knight-batman-iron man- avengers순입니다.
그럼 목록을 sorting해보도록 하겠습니다.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
db.observeSingleEvent(of: .value) { (snapshot) in
//()타입캐스팅 ID필요없고, term이랑 timestamp만 필요하다
guard let searchHistory = snapshot.value as? [String: Any] else { return }
//let datas = Array(searchHistory.values)
//object -> Json
let data = try! JSONSerialization.data(withJSONObject: Array(searchHistory.values), options: [])
let decoder = JSONDecoder()
let searchTerms = try! decoder.decode([SearchTerm].self, from: data)
self.searchTerms = searchTerms.sorted(by: { (term1, term2) in
return term1.timestamp > term2.timestamp
})
self.tableView.reloadData()
혹은 sorted{ $0.timestamp > $1.timestamp }도 가능합니다.
'iOS > Swift 어플 따라하기' 카테고리의 다른 글
[Swift] Camera App 1(captureSession설정) (0) | 2022.04.08 |
---|---|
[Swift] info를 이용한 사용자 권한 받기 (0) | 2022.04.07 |
[Swift] Firebase 서버(RealtimeDatabase)에 저장된 데이터 불러오기 (0) | 2022.04.06 |
[Swift] Firebase를 이용하여 검색어 서버(RealtimeDatabase) 저장 (0) | 2022.04.06 |
[Swift] ContainerView 속 CollectionView(Horizontal) (NestedScrollView) (0) | 2022.04.05 |