📱 iOS 플젝 개발일지

[iOS/Swift] UITableView 행 삭제를 빠르게 했을 때 앱 크래쉬 나는 현상 (App Crash When Deleting row fastly)

dev_zoe 2023. 3. 8. 01:31
반응형

1) Issue

사이드프로젝트의 QC를 진행하던 중, 아래 테이블뷰 옆에 달려있는 행 삭제 버튼을 빠르게 연타(삭제 버튼을 누르면 해당 항목이 삭제되고 그 다음 항목이 올라오게 되는데, 그 버튼을 계속 빠르게 연타했을 때의 상황이었음) 했을 때 앱이 크래쉬난다는 이야기를 팀원으로부터 들을 수 있었고

Firebase Crashlytics의 내용을 살펴보니 아래 내용에서 크래쉬가 나고 있었음을 알 수 있었다.

아래 코드는 현재 내가 누른 셀의 테이블뷰에서의 indexPath를 가져오는 코드이다.

에러는 'doneTableView의 현재 cell의 indexPath를 가져올 수 없다. nil값인데 강제로 왜 언래핑 하려고 하니!' 라는 에러였다.

 

2) Problem

우선 cell에 해당하는 indexPath가 있을거라 장담하고 강제 언래핑을 한 실수도 있겠지만 (여기서 guard문과 옵셔널의 중요성을 너무 느꼈다 ㅠㅠ)

삭제 버튼을 천천히 누르면 튕기지 않는데, 왜 빠르게 연타하면 튕길까? 를 고민해보기 시작했다.

실제로 내가 저 버튼을 누르고 있는 셀의 indexPath를 콘솔로 찍어보니, 연타했을 때 nil 값이 떴었다.

해당 indexPath를 뜯어보면 '셀이 보이지 않으면 nil을 return한다' 라고 나와있다.

관련해서 스택오버플로를 여러번 뒤져보니,,

https://stackoverflow.com/questions/41856510/tableviewindexpathforcell-returns-nil-when-clicking-in-cell

 

해당 답변을 보고 추측하기로는 셀을 삭제하면서 테이블뷰가 해당 리스트의 뷰를 다시 그리게 되는 과정이 있는데, 다시 그려내기도 전에 (보이지 않는 상황)에서 셀의 인덱스를 찾으려고 시도했기 때문이 아닐까...? 싶다.

 

3) Solution

일단 guard를 쳐서 해당 cell의 indexPath를 받아오지 못할 때, 아무 동작을 하지 않도록 처리했다. 강제 언래핑(!)을 쓰는거보다 옵셔널과 guard를 쳐서 값을 검증한다음에 사용하는 것이 너무 중요하구나를 깨달은 계기가 되었다.

조만간 guard let, if let 등 값을 안전하게 보호하며 꺼내오는 방법에 대해 자세히 공부해봐야겠다.

 

반응형