끝나지 않는 문제 해결

Judy·2021년 9월 3일
0

1. FireStore Image Load

첫 화면에서 사진 로드 시간 줄이기가 해결됐다...!

지난 글에도 썼듯이 아주 오래 전부터 고질적인 문제였는데 과거 버전을 찾아보면서 문득 각주처리 해놨던 다른 로드 방식이 보였고 공식 문서를 찾아보니

"파일을 빠르게 다운로드 하는 방법"

이렇게 명시되어 있던걸 지금에서야 알았다... 다운로드 방법만 바꾸면 됐다니 🥲
처음에 이 방법도 써봤지만 데이터를 얼마 시도 안해봐서 별 다른 차이를 못느껴 메모리를 걱정하며 다른 방법을 택했는데 그 파장이 아주 먼 길을 돌아오게 했다..

2. 이미지는 한 번만 받아오자

이제 이미지는 빠르게 받아오는데 곡 한 번에 해결되는 법이 없다. 😂

이전의 original image와 thumbnail image 두 가지 이미지를 사용했을 때는

if cellData[indexPath.row].orgImg != nil{
	cell.imgPlace.image = cellData[indexPath.row].orgImg
}else{
	cell.setImage(cellData[indexPath.row])
}


이미지를 받은 후 PlaceData에 orgImg에 사진을 저장했기 때문에 orgImgrk nil인지 확인해서 반복해서 다운받지 않게 했다.

하지만 왜인지 새로운 장소를 생성하거나 삭제되는 이벤트가 발생하면 다시 다운로드를 받는 현상이 일어났다..

아마 전체 장소가 들어있던 places가 reset되고 orgImg에 넣어둔 사진이 날아가는거 같은데 방지할 방법을 찾지 못해 결국 다시
placeImages = [String : UIImage]() 를 사용하는 방식으로 돌아갔다.

사진을 다운로드 하면 placeImages에 이름과 함께 저장하고 화면이 바뀔 때마다 places(장소 리스트)와 placeImages(사진 리스트)를 모두 넘겨 사용했다.

Custom Cell이 아닌 메인에서 이미지를 다운받아 봤는데 거의 5번씩 다운로드 하는 기현상이 나타나 Custom Cell에서 Escaping Closure로 받아오게 했다.

func getImage(place: PlaceData, completion: @escaping (UIImage?) -> ()) {
	let fileName = place.name + "_original"
	if place.image == true {
		let islandRef = storage.reference().child(fileName)
		islandRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
        	let downloadImg = UIImage(data: data! as Data)
			if error == nil {
				completion(downloadImg)
			} else {
				completion(nil)
			}
		}
	}else{
		let basicImg = UIImage(named: "wethere.jpeg")
		completion(basicImg)
	}
}

또한 기본 이미지를 FireStore에서 받아오지 않고 파일 이미지를 사용하도록 했다.

3. 이미지 로드한 후 바로 반영

전에는 없던 문제인데 새로운 장소를 만들고 이미지를 올리면 이미지가 올라가지 않아 오류가 났다..

이유는 이미지가 로드되기도 전에 메인 화면으로 돌아와 이미지를 찾아서인데 전에는 안그랬느데 어느 순간 왜 문제가 생긴건지 알 수가 없었다.

_ = navigationController?.popViewController(animated: true)

화면을 닫는 명령을 이미지가 로드된 후 발생하게 했다.

이미지를 업로드하는 함수에 넣으니 이미지 변경 없이 내용만 바꿨을 때는 화면이 넘어가질 않아서 결국 이미지 업로드하는 모든 경우에 따로 명령을 넣었다.

4. 이미지 수정 반영

전체 이미지를 담은 placeimages를 전역변수로 쓸 때에는 어디서든 변경할 수 있었기 때문에 이미지를 변경하면 바로 반영이 되었다.

하지만 전역변수에 이미지를 넣어두는건 메모리에 문제가 있을거 같았고 thumbnail을 쓰면서 PlaceData에 이미지를 넣게 되자 placeImages가 필요없게 되었다.

이후 여러 문제를 거쳐 다시 placeImages를 쓰게 됐지만 전역변수가 아니라 이미지를 변경해도 바로 반영이 어려웠다.

editData?.newImg = selectedImage
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "newPlaceUpdate"), object: editData)
                isImage = true

placeInfoView에서 장소 삭제를 위해 만든 Notification을 변경해서 사용했다.
PlaceData에 newImg 변수를 만들고 object로 PlaceData를 보내게 했다.


  @objc func newUpdate(_ notification: Notification){
        newUapdate = true
        if notification.object != nil{
            let data = notification.object as! PlaceData
            if data.newImg != nil{
                placeImages.updateValue(data.newImg!, forKey: data.name)
            }else{
            	...
            }
	}
}

새로 바뀐 이미지가 있으면 placeImages에 업데이트 하고 아니면 장소 삭제를 처리하도록 했다.

마무리

이전에 섬네일 써서 사진 두개로 하던 것들, placeimages 쓰던 방식을 없앤 것들이 섞여서 총체적 난국이라 다시 여기저기 수정했다...

왜 한 번에 제대로 되지 않는가 😭

그래도 많은 문제가 있었지만 드디어 해결됐다!!!

profile
iOS Developer

0개의 댓글