SHcommit / LearnMoreSwiftInUdemy

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Clone/Instagram] Profile Scene 기능 개선, MVVM패턴 적용 | 색다른 시도 & 새롭게 알게 된 개념 & 개선해야 할 기능 #8

SHcommit opened this issue · comments

Profile Scene 기능 개선, MVVM패턴 적용

구현 영상

강의와 다른 색다른 시도

Navigation.title in ProfileVC

  • 강의에서는 이미지 처리과정이 안나왔다. 그래서 여전히 제자리 걸음이었다. 이전 구현과 같이 여전히 ProfileVC로 이전했을 때 비동기 처리작업이 너무많아 navigation.title 도 업데이트 되지 않았다. 여기서 궁금했던 것이 커스텀 뷰를 navigation.titleView로 사용할 경우에 Scene가 진행중에 쉽게 값을 바꿀 수 있는데 기본적인 navigation.title의 reload하는 방법을 찾아 봤지만 알 수 없었다. 물론 답은 알고 있었다. profileVC가 로딩되기 이전에 미리 값을 주면 되는데 이게 싫었지만 방법을 몰라서 결국 앱의 초기 진입 화면의 컨트롤러에서 profileVC의 title에 들어갈 값을 미리 파이어베이스에서 받아왔다.

tabBar로 profileVC 초기 클릭시 FireStore, Storage에서 다운받은 사진, 사용자 정보가 2~3초 뒤에 나타나는 오류(링크 내용 중 개선해야할 기능의 gif에 해당)

  • profileVC의 profileHeader에서 사용자의 이름, 프로필 사진이 필요한데 이는 Firebase의 Storage, Firestore에 저장되있었다. 이를 파싱하려면 파이어베이스 관련 함수를 꼭 써야 하는 것 같은데 진짜 느리다.. 프로필 사진 데이터가 정말 작을 텐데 채감상 23초 걸리다니 ㅠㅠ,,, 성공적으로 profieVC는 구현했지만 느린 파이어베이스 덕에 이를 해결하기 위해 고민을 많이 했다. 어떤 방법을 쓰고 비동기 처리, QoS 처리??(더 자세히 공부해야겠다.)등을 해도 느리다는 것을 깨닫았다.
    그래서 생각한 것이 그냥 초기 메인 홈뷰로 진입할 때 비동기 처리로 파이어베이스에서 프로필 사진과 사용자의 데이터를 비동기로 받아 버렸다. 초기에 메인 홈 뷰로 진입하는게 1
    2초 딜레이가 있지만 흰색 배경이었다가 화면이 보여져서 자연스러웠고 profileVC로 이동시에도 비동기처리된 사진과 사용자 정보를 메인 홈 탭컨트롤러로부터 nil이 아닌 바인딩(didSet)된 실제 값을 통해 정보를 화면에 보여줌으로 이전보다 정말 빨라보였다,, 호호호

MVVM패턴 적용

  • 이미지 처리에 대해 고민을 너무해서 MVVM패턴을 잊고 있었지만 HomeVC, ProfileVC등에 ViewModel을 통해 View들을 수정하도록 적용했다. 이때 HomeVC, ProfileVC에서 사용될 수 있도록 ViewModel을 선언했다. 둘 중 하나는 image 프로퍼티를 안쓰는데 그냥 nil처리하면 됬다.

  • 완벽하진 않다. 아직 Controller의 의존성을 갖고 있다.. 옵저버등 공부해서 완벽하게 VM과 View의 동작을 만들어보고 싶다.

새로 알게 된 개념

  • Firestore.firestore() 수식어가 길어서 사용자의 정보를 파이어베이스에서 fetch 할 때 새로운 프로퍼티로 참조해서 사용했었다. 이와 달리 Firestore.firestore(), Auth.auth(), Storage.storage() 등을 전역변수의 constant 변수로 하는 파일을 새로 구현했다는게 신선했다. 원래 C++에서는 자주 사용하고 선언 했었지만 swift에서는 전역 constant변수를 많이 선언하지 않았는데 이 기회를 토대로 많이 사용해야 겠다. 바로 리펙터링 했다.

탭바 컨트롤러에서 특정 VC 인스턴스 얻는 방법

tabBarController의 특정 VC 인스턴스는 tabBarController as? 특정VC클래스로 캐스팅한 인스턴스로 얻을 수 있다.

델리게이트 패턴에 관해 ***

내가 생각했던 델리게이트는 특정 a VC에서 다른 b VC로 1대1 관계로 생각했었는데 c VC에서 b vc로 호출할 때 a vc의 인스턴스를 넣어줌으로 델리게이트를 구현할 수 있다는 사실을 새롭게 알게 되었다.

잘못 git add한 staged에 있는 파일을 다시 Unstage로 변경하는 명령어

  • git reset HEAD [file] 명령어를 통해 git add를 취소할 수 있다.

개선해야 할 기능

  • 회원가입 실패 시 버퍼링 끊기

  • 뒤늦게 확인했는데 ProfileVC진입시에 파이어베이스에서 받은 데이터를 홈뷰 진입시점으로 바꿨는데 로그인 -> 홈뷰로 갈 때 2초의 빈 상태가 있는데 다시 수정해야 한다.

  • ProfileController에서 grid, list bookmark 버튼이있는데 이를 stackview+pageViewController로 추가 구현해보기

  • 사용자 로그아웃 후 로그인 하고 프로필 VC들어가면 이전 사용자 기록이 있다. (왜이러지,, currentUser의 uid로 초기화 항상 되는데,, 다시 수정 해야한다.)

공부해야 할 것

  • super.init(collectionVIewLayotu:) 시점에 UICollectionViewFlowLayout() 과 UICollectionViewLayout() 차이
  • QoS처리

느낀점

  • 저번 ProfileHeader 기능 구현할 때 Firestore과 storage를 통해 최근 로그인된 사용자 정보와 이미지 불러와 ProfireHeader의 정보를 구현하도록 혼자 짜봤는데 이번 강의에도 파이어베이스에서 데이터들로 ProfileHeader를 갱신하는 강의가 있었다.