트러블 슈팅 코인 리스트 - donggeonoh/bithumb-techcamp-ios-1st GitHub Wiki

1. 전체코인목록(원화)에서 관심코인목록으로 Coin을 복사를 할 경우 diffable data source에서 중복 오류를 내는 문제 발생 - 제로

Coin을 그대로 복사하면 Coin의 hash value가 동일하기 때문에 같은 중복된 item으로 data source가 인식하기 때문에, Coin을 새로 생성해서 가진 UUID값이 다르도록 하게 해서 해결하였습니다.

2. 관심 버튼을 누르고 data source에 snapshot을 apply하여도 관심 버튼 변화가 반영이 안되는 문제 - DonggeonOh, 제로, 허황

Diffable data source는 hash value를 기준으로 변화를 감지하는데, 이때까지는 item identifier을 Hashable하게 만들 때 UUID만 사용했기 Coin의 isFavorite 프로퍼티의 변화를 감지를 못하는 것이었습니다.

item identifier를 Hashable하게 만들 때 item identifier의 property 모두를 사용하도록 hash(into hasher:) 함수와 static func == 함수 정의를 아예 빼버림으로서 해결하였습니다.

3. coinListCollectionView에 data manager 클래스를 만들어 코인의 정렬과 같은 기능을 담당할지 고민 - 제로

data manager 클래스가 정렬기능을 가지면 ViewController의 일을 줄일 수 있기 때문에 좋을것이라고 예상했습니다.

더 나아가 data manager 클래스가 통신 기능을 가지면 굳이 MVVM패턴을 사용하지 않고 MVC패턴에서도 ViewController의 비대화를 막을 수 있을 것이라고 예상하여

data manager 클래스를 생성하여 data source에 사용되는 Coin의 관리, 정렬 그리고 통신 기능을 담당하게 하였습니다.

4. 처음에 현재가 정하려고 전체 코인목록에 있는 코인마다 다 transaction api를 호출(192번)하려고했지만 보여지는 셀만 통신하면 된다고 생각하여 보여지는 셀만 통신을 하는걸로 구현. 하지만 그렇게하니 전체 기준으로 정렬할 수가 없었음. 다시 192번 호출하는거로 바꿨는데, 192번 호출 후 모두 완료됐음을 확인을 어떻게 할것인지 고민 - DonggeonOh, 제로, 허황

192번의 비동기 작업을 하나의 태스크로 만들어 줄 수 있는 DispatchGroup을 이용하여 작업의 완료를 확인할 수 있었습니다.

5. 코인목록을 sort하는 함수에서 소트할 리스트를 인자로 넣고 리턴값으로 결과를 받아서 다시 소트할 리스트에 대입하는 방식을 썼었는데, 코드를 간결하게 하기 어려움이 있었음 - 제로

Array의 private extension으로 filter와 sorted함수를 구현하여 코드를 간결화 시켰습니다.

6. 웹소켓 적용 시 스크롤이 무작위로 되는 버그 - DonggeonOh, 제로, 허황

전체를 data source에 apply 하지 않고 보이는 visible cell만 apply함으로서 해결하였습니다.