Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

연락처 관리 앱 [STEP3] JaeHyeok, Dora #43

Open
wants to merge 4 commits into
base: 2_JaeHyeok
Choose a base branch
from

Conversation

KSK9820
Copy link

@KSK9820 KSK9820 commented Oct 19, 2023

리뷰어: @zdodev
버드: @KSK9820, @SimJaeHyeok

소대, 안녕하세요! [STEP 3] PR 드립니다🙌🏻

Summary ⛳️

구현 기능 및 상세

  • 필수 테이블뷰의 셀을 스와이프하여 삭제하는 메뉴를 보이고, 실제로 삭제할 수 있습니다.
  • 검색기능 통해 연락처 목록 내의 특정 연락처만 테이블뷰에 남길 수 있습니다.

고려했던 점 👀

  • 색인 이상의 의미가 없어진 2차원 배열의 데이터 모델을 1차원 데이터 모델로 수정하며, 해당 수정에 따른 로직들도 함께 수정하였습니다.
  • 테이블 뷰에 연락처를 추가하고 삭제하는 과정에서의 오버헤드에 대해 고려했습니다.
    • 연락처를 하나만 삭제하는 과정에서 tableView.reloadDate()는 큰 낭비라고 판단했습니다.
    • 이 오버헤드를 줄이는 방법으로 deleteRows와 deleteRows에 대해 찾아보았고, 둘의 차이에 대해서 공부하였습니다.
    • 결론적으로, deleteRows는 테이블 뷰의 데이터 소스에서 업데이트 이전 값에서 연산한 값(1)과 업데이트 이후의 값(2)이 서로 동일하면 오류가 발생하고,
    • reloadRows는 업데이트 이전 값(1)과 업데이트 이후 값(2)이 다르다면 오류가 발생하였습니다.
    • 또한, 이 둘 메서드를 사용할 때 tableview는 테이블 뷰의 행의 개수를 항상 체크하는 것으로 결론 지었습니다.
    • 해당 결론과 과정에 다시 짚어보거나 잘 못된 부분이 있는지 알고 싶습니다.

질문 사항

  • 의존성에 대해서 질문드리고 싶습니다.
    • UISearchBar의 입력 값에 따른 테이블 뷰의 화면을 네 가지로 분류하였습니다.
    • 아무것도 입력하지 않은 초기 화면, searchText가 있고 결과값이 있는 경우와 없는 경우, searchText를 입력하고 지우고 난 후, 이외
    • 이를 인지하려면 searchBar에 현재 text의 유무를 파악해야해서, 이를 외부 전역 변수에 저장하고 다른 함수에서 사용하였습니다.
    • 이렇기 때문에 의존성이 높아지게 됩니다. 이를 피하고자 하는 다른 방법이 있을까요?
  • 접근제어자 internal과 public의 차이를 잘 모르겠습니다.
    • internalprivate는 접근에 관한 명확한 차이가 있는데, internalpublic의 명확한 차이를 모르겠습니다. internal의 경우 하나의 모듈에서 접근이 가능하고, public의 경우는 모듈 외부에서 접근 가능하다고 나와있는데 어느 범위인지 알고 싶습니다.

Copy link

@zdodev zdodev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요. @KSK9820 , @SimJaeHyeok !

Step3를 최대한 진행해보셨네요!
검색 기능과 셀 삭제 기능을 잘 구현해보셨네요🙂

다만 특정 케이스에서 셀 삭제 시 에러가 발생하고 있습니다.
스크린샷 2023-10-19 오후 11 46 30

해당 에러를 한번 파악해서 해결해 볼 수 있을까요?

접근제어자 internalpublic의 경우,
Swift, Xcode의 프레임워크, 라이브러리 와 같은 키워드를 알아보면 좋을 것 같습니다!

다른 질문은 궁금증과 함께 코멘트로 남겨보았습니다~

}
private var contacts = [Contact]()
private var filteredContacts: [Contact]?
private var searchText: String?
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금처럼 searchText 프로퍼티를 검색 텍스트로 사용하는 것도 좋은 방법이라고 생각합니다🙂

@@ -26,24 +26,24 @@ class NewContactViewController: UIViewController {
phoneNumberTextField.delegate = self
}

func navigationSetting() {
private func navigationSetting() {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private 키워드를 사용해보셨네요.👍

@@ -59,14 +59,14 @@ extension NewContactViewController {
saveAlert(Contact(name: name, phoneNumber: number, age: age))
}

func cancelAlert() {
private func cancelAlert() {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동사형으로 메서드를 시작해보는 것은 어떨까요?

Copy link

@silverjaehyeok silverjaehyeok Oct 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

func cancelAlert() {} // 수정 전 
func showCancelAlert() {} // 수정 후 

알럿을 보여주는 메서드이기때문에 말씀하신대로 동사형으로 수정하였습니다.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정한 버전에서 에러가 발생하고 있습니다! 확인해볼 수 있을까요?

@@ -76,28 +76,28 @@ extension NewContactViewController {
present(alert, animated: true)
}

func nameCheck() -> String? {
private func nameCheck() -> String? {
guard let name = nameTextField.text else {
return nil
}
return name == "" ? nil : name.components(separatedBy: " ").joined()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

name.isEmpty 로 표현하는 것도 좋은 방법일 것 같습니다!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 해당 부분 수정하였습니다!

guard let name = nameTextField.text else {
return nil
}
return name == "" ? nil : name.components(separatedBy: " ").joined()
}

func ageCheck() -> Int? {
private func ageCheck() -> Int? {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동사형으로 메서드를 시작해보는 것은 어떨까요?

Copy link

@silverjaehyeok silverjaehyeok Oct 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

func ageCheck() {} // 수정 전 
func checkAge() {} // 수정 후

수정하였습니다.

guard let ageText = ageTextField.text, let age = Int(ageText) else {
return nil
}
return age
}

func numberCheck() -> String? {
private func numberCheck() -> String? {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동사형으로 메서드를 시작해보는 것은 어떨까요?

Copy link

@silverjaehyeok silverjaehyeok Oct 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

func numberCheck() {} // 수정 전 
func checkNumber() {} // 수정 후 

수정하였습니다.

Comment on lines 48 to 49
addressBook.deleteContact(indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tableView 의 셀과 인덱스 동작 방식과 데이터 모델의 싱크를 잘 맞출 수 있다면,
해당 방법도 문제가 되어가 잘못된 방법이 아니라고 생각이 듭니다.
지금 로직에서 발생한 문제를 파악해보는 것도 좋은 경험이 될 것 같습니다!🙂

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addressBook.deleteContact(indexPath.row)
defer {
    tableView.deleteRows(at: [indexPath], with: .automatic)
}

실제 데이터에서 사라지는 것이 먼저이기 때문에 deleteRows를 defer문 안에 넣어 함수가 종료할 때 즉시 실행되도록 구현하였습니다.
혹시 다른 방법도 있을까요?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 배치 상, 데이터가 삭제되고 테이블뷰의 row가 지워지기 때문에 코드 실행 순서의 문제로는 보이지 않습니다.
연락처를 추가하고 검색 필드에서 검색할 때, 테이블뷰의 데이터가 2배로 늘어가서 보이는 문제가 발생하고 있습니다.
아마 해당 인덱스를 찾는 과정에서 에러가 발생하지 않을까 싶습니다.🙂
고민해보시고 의견 주시면 좋을 것 같습니다~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants