Skip to content

[Clone/Instagram] 팔로우, 언팔 기능 추가. 이미지 처리 개선 | 새롭게 알게 된 개념 & 느낀점 #10 #23

@SHcommit

Description

@SHcommit

새롭게 알게 된 개념

  • UISearchController

검색을 하면 특정 단어만 tableView cell에 나오도록 하는 방법.

UISearchResultsUpdating 프로토콜을 채택해서 updateSearchResults(for:)
메서드로 사용자가 검색을 할 때마다 매개변수.searchBar.text를 통해 받아지는 바인딩 된 사용자의 검색 단어를 얻어서 db의 특정 키워드에서 항목들을 찾아낸다.

그 예로 검색 창에서 타 사용자의 아이디를 찾고 싶은 경우 filter 메서드를 사용한다. 조건에 맞는 원하는 특정 index만 [Element]로 반환하는게 filter함수이다. 그렇게 특정 데이터만 반환된 리스트를 따로 프로퍼티에 저장해서 TableView cell을 특정 조건에 맞게 갱신하면 된다. filter에 의해 searchBar의 바인딩 된 값은 곧 사용자가 검색을 했음을 의미함으로 바인딩 될 때마다 tableView.reloadData()를 통해서 tableView의 numberOfRowsInSection, cellForRowAt를 구현하면 된다.

  • 사용자끼리의 팔로우 관계는 어떻게 생성될지에 대해서 많이 궁금했다.

한 휴대폰에서 A가 로그인 했다면 나를 제외한 다른 사람들한테 팔로우를 걸 수 있다. 이때 팔로우를 눌렀을 때 그 사용자에 대한 db의 특정 위치에 값을 증가시키면 된다. 여기서는 맨 처음에 회원가입을 할 때 이메일과 비밀번호를 통해 유일한 사요자 구별 키 값인 uid를 받는데 이를 활용해서 사용자의 인적사항을 포함한 도큐먼트를 uid로 저장하고 팔로우나 언팔도 각각의 uid에 대해서 몇명의 사용자가 팔로우 했는지 uid를 통해 저장, 중복처리를 하면 된다.

누군가를 팔로우 할 때는 followers. following 둘 다 업데이트 해야한다.

내가 타 유저에게 팔로우 할 때

앱을 사용중인 현재 사용자가 누군가를 팔로우 한다면 팔로우 당한 타 사용자의 식별 아이디가 필요하다. 그 해당 식별자의 팔로워 수를 증가시키려고 등록해야 하기 때문이다. 그렇다면 내가 팔로우 버튼을 눌렀을 때는 내가 팔로우 중인 db에 타 사용자를 추가해야 하고 타 사용자의 팔로워 숫자에 내 계정을 등록시켜야 한다. 여게서 타 사용자의 모든 정보를 등록해야 할 까? x 최소한으로 식별 가능한 ex) uid와 같은 정보만 등록하면 된다.

느낀점

  • 클린 코드를 읽은 후에 중복되는 코드가 없에 최소한, 효율적인 코드를 구성하고 싶어서 ViewModel이 다른 controller에서 실행되는데 성능이 거~의 같아서 컨트롤러는 다르지만 VM을 같은 것을 사용했는데 기능을 추가하다보니 점점 두 컨트롤러의 VM차이가 나서 결국 따로 분리하게 됬다. 따라서 일단 따로 분리하고 다 구현했을 때 같은 거를 묶는 식으로 개발을 해야 할 것 같다는 생각을 했다.

  • 강의에서 파이어베이스의 Storge에서 이미지를 다운 받아올 때 SDWebImage 오픈 라이브러리를 사용한다. 이 라이브러리의 함수를 쓰면 이미지를 받아와 ImaeView에 저장하고 비동기 처리와 동시에 캐싱 처리까지 되는 것 같다. 근데 실력향상할겸 그냥 내가 스스로 비동기 처리를 했는데 이미지 한개 받을 때는 그냥 불러오면 됬었다. 근데 여러개의 이미지가 있는 cell을 구현할 때는 dequeue관련 함수를 통해서 cell을 불러오는데 이미지를 다시 불러올 때 상당히 느렸다. 그래서 찾아본 결과 NSCache를 공부해야 할 것 같다. 그렇지 않으면 테이블 뷰를 예로들 때 위에 스코롤 하면 이미 있던 이전 이미지가 나온 후에 스크롤이 끝나고 해당 cell의 이미지로 로드된다. 일단 임시로 이미지가 이전 이상한 이미지에서 현재cell의 이미지로 로딩되는 것보단 흰색 -> 이미지로드로 바꾸었다. 추후에 바로 NSCache등을 통해서 효율적으로 이미지 처리를 해봐야겠다.

//좌 이전 이미지 , 우 임시로 개선한 이미지

마주한 에러

  • Auth.auth().currentUser 값이 동기적으로 갱신되지 않는 에러

Auth.auth().currentUser를 통해서 현재 핸드폰에 로그인 한 사용자의 정보를 토대로 팔로우, 언팔, 정보등을 기록하고 업데이트 한다. 지금 현재 사용자가 로그아웃 후 다른 계정으로 로그인 했을 때즉각적으로 Auth.auth().currentUser의 값이 Auth.auth().signIn(withEmail:password:)를 통해 synchronous하게 갱신되야 한다. 하지만 실제로 그렇지 않았다. (참고 글) 음.. Auth.auth().currentUser에 상당히 의존적이었다. 프로필 상세정보, 이 정보를 토대로 다른 사용자의 팔로우 언팔 등을 다 Auth.auth().currentUser의 특정 값을 통해서 파싱 받고 처리했는데.... 앱을 완전히 종료 후 재 시작해야 비로소 이 값이 최신 상태로 바뀌기 때문에 다른 대안이 필요했다.

// AUTH.updateCurrentUser(user:) 이 함수도 적용x

영구 저장소를 사용해서 현재 로그인 중인 사용자의 정보를 파싱받을 수 있는 키 값만 따로 저장하고 현재 정보를 파싱받는 관련 함수을 전부 고치니 정상적으로 현재 사용자의 정보가 즉각 갱신됬다.

// currentUser대신 영구저장소에 로그인된 사용자의 정보를 등록하고 이를 토대로 currentUser 정보를 fetch한 이후에 Auth.auth().currentUser의 단점을 보완할 수 있었다. 아래 영상은 정상적으로 팔로우, 언팔이 되는 영상이다.

구현하면 서 어려운 점

  • 지금까지 제일 까다로운 것은 다량의 이미지 처리를 효율적으로 사용하도록 구현하는 방법이 제일 어렵고 지금도 고민중이다.

스크린샷 2022-11-05 오후 12 29 18

  • 파이어베이스에서 이미지 다운을 너무해서 할당량을 초과했었는데 음? 몇번 하지도 않은것 같은데 할당량을 초과해서 기능을 이미지 파싱이 잘 됬는지, 타 VC에서 이미지 로드가 잘 됬는지.. 중복된 코드, 중복 파싱 하려는 코드를 없애는데 할당량 초과가 되버리니까 확인을 못해 답답했다. 파베 쓸 때 이점 조심해야겠다.

색다른 시도

  • 검색창에서 특정 cell을 터치할 때 이전에 저장된 dequeue의 cell의 정보를 토대로 사용자의 디테일한 정보를 보여 줬다.

  • 추후에 또 개선할 건데.. 일단 임시적으로 정확한 정보를 보여주기 위해 재사용큐에서 꺼내올 때 흰색으로 구현했다.

  • Auth.auth().currentUser가 꼭 앱을 종료했다 다시 실행해야 바뀌기에 영구 저장소를 활용했다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions