1. 문제 상황

나의 찡구 뎐듄뎌가 발견해준 에러가 있었다. 펫 프로필의 글자 제한수는 4글자이고, 사용자 프로필 글자 제한수는 10글자였는데,

펫 프로필 변경 후 → 사용자 프로필을 변경하는 과정에서 사용자도 4글자로 제한되는 일이 벌어졌다.

Untitled

문제 원인

문제 원인은 바로 중복으로 노티가 적용되었기 때문이다. 아래 나와있는 코드가 똑같이 펫 이름을 제한하는 코드에도 있었고 노티가 중복되어서 문제가 생기게 되었다.

즉. 1대1 용도로 사용하려한 하나의 노티피케이션 옵저버를 다수의 뷰컨트롤러에서 등록하고 응답에 대한 중복 문제가 발생한 것이다.

NotificationCenter.default.addObserver(self, selector: #selector(textDidChange), name: UITextField.textDidChangeNotification, object: nil)

@objc private func textDidChange(_ notification: Notification) {
        guard let textField = notification.object as? UITextField else { return }
        guard let text = textField.text else { return }
        var textFieldState: BaseTextFieldState
        switch text.count {
        case 1...9:
            textFieldState = .isWritten
        case 10...:
            textFieldState = .isFull
            let fixedText = text.substring(from: 0, to:9)
            textField.text = fixedText + " "
            
            let when = DispatchTime.now() + 0.01
            DispatchQueue.main.asyncAfter(deadline: when) {
                textField.text = fixedText
            }
        default:
            textFieldState = .isEmpty
        }
        
        textFieldState.setTextFieldState(
            textField: nil,
            underLineView: rootView.underLineView,
            button: rootView.completeButton,
            label: rootView.numberOfNameCharactersLabel
        )
        setTextFieldText(textCount: text.count)
        
    }

iOS Notification 노티 사용 시 주의할점(중복노티 방지)

2. 문제 해결 + MVVM

물론 뷰의 생명주기에 맞춰서 노티를 등록하고 삭제하는 방법도 있지만, 나는 각각의 뷰모델을 따로 분리하여 이 문제를 해결해보고 싶었다. (mvvm 패턴을 적용해보고 싶었다.)

2-1. MVVM?

Model-View-ViewModel로 구성된 아키텍처 패턴 중 하나로,

Model: 데이터, 네트워크 로직, 비즈니스 로직등을 담으며 데이터를 캡슐화하는 역할 View: 사용자에게 보여지는 화면(UI, 레이아웃) View Model: 핵심적인 비즈니스 로직으로 View에서 받은 이벤트를 처리하고Binding을 통해 즉시 View로 전달

MVVM 패턴의 장단점

장점: Binding을 통하여 View와 View Model 간의 의존성까지 최소한 형태

단점: 설계가 복잡하고 간단한 프로젝트에서는 View Model 설계가 오히려 능률이 떨어짐

동작흐름