다이어리 앱 개발 중 테이블뷰에 데이터를 뿌려줄 때, 가장 최근 날짜 순으로 데이터를 가져오기 위해 정렬이 필요하다. 파이어스토어에 데이터를 생성할 때 TimeStamp순으로 순차적으로 쌓이나?싶었지만 그런거 없이 무작위로 데이터가 생성되었다. 그래서 데이터를 get해올 때 내가 만든 데이터에 timeStamp를 찍어주고 그 기준으로 정렬하라는 쿼리를 같이 써줘야한다.
공식문서에 보면 아래와 같이 샘플코드가 있다. 이때 by에 들어가는 string은 해당 string에 부합하는 특정 필드가 있는지도 필터링해준다. 아래로 예를 들면 state와, population필드가 존재하는 데이터여야하며, 존재하지 않은 데이터는 제외된다. descending에 true를 해줬기에 population을 기준으로 내림차순으로 정렬해준다.
citiesRef
.order(by: "state")
.order(by: "population", descending: true)
직접 프로젝트에 구현한 코드는 아래와 같다.
컬렉션 => 도큐먼트=>컬렉션을 타고 들어가 나오는 모든 문서들 중에서 timeStamp필드가 존재하고, 이를 기준으로 내림차순으로 정렬해서 diaryArray에 담아주도록 구현했다.
db.collection("Diaries")
.document(userUid!)
.collection("Diary")
.order(by: "timeStamp", descending: true)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
if let stamp = document.data()["timeStamp"] as? Timestamp {
self.diaryArray.append(Diary(content: document.data()["content"] as! String, timeStamp: stamp.dateValue() as! Date, emoji: document.data()["emoji"] as! String, documentId: document.data()["documentId"] as! String))
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
정렬전은 아래와 같이 다이어리가 날짜에 상관없이 무작위로 로드되는 걸 알 수있다.
위 코드 구현 후 날짜를 기준으로 내림차순 정렬이 되어 가장 최신으로 작성한 다이어리가 위쪽에 보이도록 변경되었다.
'[iOS] App Development' 카테고리의 다른 글
[iOS] 회원탈퇴 기능 추가시 유의사항, UserDefault - get, set, remove, 삭제여부확인 (0) | 2022.01.30 |
---|---|
[iOS] 비동기 프로그래밍 : Sync, Async, Concurrent, Serial (0) | 2022.01.26 |
[iOS] SwiftUI : 한 사이즈의 서로 다른 디자인 위젯 여러 개 만드는 법 (2) | 2022.01.08 |
[iOS] 동기/비동기 처리, 컴플리션 블럭(Completion Block) (0) | 2022.01.01 |
[iOS] SwiftUI 로 개발한 위젯에 Custom Font 사용하는 법(+폰트인식 못할 때) (0) | 2021.12.28 |