업데이트를 진행하면서 이전 앱에서도 구현되지 않았던 메이트 구현 중 메이트 목록을 수정할 수 있도록 구현하였다.
이전에는 메이트 목록을 수정하려면 전체 목록이 사라지고 처음부터 다시 입력을 해야했지만, 업데이트를 진행하면서 해당 내용도 같이 구현했으나, 그 과정이 순탄치는 않아서.. 기록으로 남겨두려고 한다..
먼저 메이트를 추가해서 DetailInputVC에 mateCollectionView에 들어가도록 하는 내용은 미리 구현이 되어있었다.
여기서 다시 메이트 추가를 누르면 지금 가지고있던 메이트컬렉션 뷰를 메이트VC로 보내 이전에 선택되어있는 값은 그대로 선택되어있도록 구현하려고 한다.
새로운 PinLog 일 때 메이트 값 저장
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if collectionView == mateCollectionView {
if indexPath.item == 0 {
let mateVC = MateViewController()
mateVC.delegate = self
mateVC.addedMates = selectedFriends
navigationController?.pushViewController(mateVC, animated: true)
}
}
}
메이트 컬렉션뷰의 0 인덱스를 선택하면 메이트 VC로 이동되기 때문에 화면이 넘어갈때 가지고 있던 selectedFriends를 메이트VC에 있는 addedMates에 넘어 가도록 구현하였다.
이렇게 넘어간 addedMates 에는 이미 선택된 메이트가 넘어가도록 구현되어있고 addedMates는 addedMatesCollectionView에 들어가 있게 된다.
이렇게 새로 만든 핀로그의 경우 간단하게 메이트 저장값을 오고 가게 할 수 있었다.
존재하는 PinLog 일 때 메이트 값 수정 및 삭제
문제는 이녀석이었다..
생각보다 쉽게 해결되어 이것도 쉽게 해결될 수 있다고 생각했으나, 어떤 구조적인 문제인지 아무리 값을 변경해 MateVC로 이동해도 해당 내용이 전달되기는 하나, 값을 변경하면 변경 값이 적용이 되지 않는다는 것이었다.
오랜 기간 문제가 무엇인지 생각해보았다. 안되는 순간을 생각해보면 메이트 VC 내 값이 전달은 되는데 값을 변경하고 다시 디테일인풋VC에 들어갈때 변경된 값이 적용이 되지 않았다..
이미 firebase에 저장되어있는 값을 불러 ConfigureView를 통해 수정하기, 즉 이전에 값을 그대로 가져오게 되는데
이때 저장된 메이트의 값을 가져오는 것 같았다.
그렇기 때문에 변경된 값은 파이어 베이스에 저장되어있지 않아 값이 변경되지 않는 것으로 보이는 것이었다.
그렇기 때문에 처음 ConfigureView를 통해 파이어베이스 값을 가져올때 메이트 부분은 단 한번만 호출되어 selectedFriends에 담기게 하고 변경되는 내용도 포함될 수 있도록 수정하면 값이 정상적으로 변경된다.
var isInitialLoad = true
값을 불러왔다는 점을 알 수 있도록 변수를 설정하고
func configureView(with pinLog: PinLog) {
DispatchQueue.main.async {
self.expenses = pinLog.expenses ?? []
self.spendingPublicSwitch.isOn = pinLog.isSpendingPublic
self.locationLeftLabel.text = pinLog.location
self.publicSwitch.isOn = pinLog.isPublic
self.spendingPublicSwitch.isOn = pinLog.isSpendingPublic
self.updateDateLabel(with: pinLog.startDate, endDate: pinLog.endDate)
self.selectedImages.removeAll()
self.imageLocations.removeAll()
var representativeImage: (UIImage, Bool, CLLocationCoordinate2D?)? = nil
var otherImages: [(UIImage, Bool, CLLocationCoordinate2D?)] = []
let dispatchGroup = DispatchGroup()
for media in pinLog.media {
dispatchGroup.enter()
if let url = URL(string: media.url) {
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data, let image = UIImage(data: data) {
let location = media.latitude != nil && media.longitude != nil ? CLLocationCoordinate2D(latitude: media.latitude!, longitude: media.longitude!) : nil
let imageData = (image, media.isRepresentative, location)
if media.isRepresentative {
representativeImage = imageData
} else {
otherImages.append(imageData)
}
} else {
print("Error loading image: \\(String(describing: error))")
}
dispatchGroup.leave()
}.resume()
} else {
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: .main) {
if let repImage = representativeImage {
self.selectedImages.append(repImage)
}
self.selectedImages.append(contentsOf: otherImages)
self.representativeImageIndex = self.selectedImages.firstIndex { $0.1 }
self.updateRepresentativeImage()
if let galleryCell = self.detailInputViewCollectionView.cellForItem(at: IndexPath(item: 0, section: 0)) as? GallaryInputCollectionViewCell {
galleryCell.selectedImages = self.selectedImages
galleryCell.photoInputCollectionView.reloadData()
}
}
if self.isInitialLoad {
self.loadSelectedFriends(pinLog: pinLog) {
self.mateCollectionView.reloadData()
self.isInitialLoad = false
}
} else {
self.mateCollectionView.reloadData()
}
if let textInputCell = self.detailInputViewCollectionView.cellForItem(at: IndexPath(item: 1, section: 0)) as? TextInputCollectionViewCell {
textInputCell.configure(with: pinLog)
} else {
self.detailInputViewCollectionView.scrollToItem(at: IndexPath(item: 1, section: 0), at: .centeredHorizontally, animated: false)
DispatchQueue.main.async {
if let textInputCell = self.detailInputViewCollectionView.cellForItem(at: IndexPath(item: 1, section: 0)) as? TextInputCollectionViewCell {
textInputCell.configure(with: pinLog)
}
}
}
self.switchToPage(0)
}
}
if self.isInitialLoad {
self.loadSelectedFriends(pinLog: pinLog) {
self.mateCollectionView.reloadData()
self.isInitialLoad = false
}
} else {
self.mateCollectionView.reloadData()
}
ConfigureView에 있는 메이트 정보를 한번만 가져오도록 수정했다.
func loadSelectedFriends(pinLog: PinLog, completion: @escaping () -> Void) {
let group = DispatchGroup()
selectedFriends.removeAll()
// 기존 핀로그에 저장된 attendeeIds 가져오기
for userId in pinLog.attendeeIds {
group.enter()
fetchUserSummary(userId: userId) { [weak self] userSummary in
guard let self = self else {
group.leave()
return
}
if var userSummary = userSummary {
userSummary.isMate = true
self.selectedFriends.append(userSummary)
}
group.leave()
}
}
group.notify(queue: .main) {
print("로드된 메이트 목록: \\(self.selectedFriends)")
completion()
}
}
그리고 이전 저장되어있는 값과 새로운 추가될 값을 합쳐주면 정상적으로 구현이 가능하다.
'◽️ Programming > T I L' 카테고리의 다른 글
[Project 일지] 여행 기록 앱 만들기 (13) - image loading 속도 개선하기 (0) | 2024.07.08 |
---|---|
[Project 일지] 여행 기록 앱 만들기 (12) - 2.0 버전 업데이트 진행(UI 수정 및 디테일 보완, 오류 수정) (0) | 2024.07.01 |
[Project 일지] 여행 기록 앱 만들기 (10) - 앱 승인 이후 Update (0) | 2024.06.27 |
[Project 일지] 여행 기록 앱 만들기 (9) - 3차 reject 수정 후 합격! (0) | 2024.06.25 |
[Project 일지] 여행 기록 앱 만들기 (8) - 앱 배포 및 reject 사유 수정 (0) | 2024.06.21 |