나의 찡구 뎐듄뎌가 발견해준 에러가 있었다. 펫 프로필의 글자 제한수는 4글자이고, 사용자 프로필 글자 제한수는 10글자였는데,
펫 프로필 변경 후 → 사용자 프로필을 변경하는 과정에서 사용자도 4글자로 제한되는 일이 벌어졌다.
문제 원인은 바로 중복으로 노티가 적용되었기 때문이다. 아래 나와있는 코드가 똑같이 펫 이름을 제한하는 코드에도 있었고 노티가 중복되어서 문제가 생기게 되었다.
즉. 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 노티 사용 시 주의할점(중복노티 방지)
물론 뷰의 생명주기에 맞춰서 노티를 등록하고 삭제하는 방법도 있지만, 나는 각각의 뷰모델을 따로 분리하여 이 문제를 해결해보고 싶었다. (mvvm 패턴을 적용해보고 싶었다.)
Model-View-ViewModel로 구성된 아키텍처 패턴 중 하나로,
Model
: 데이터, 네트워크 로직, 비즈니스 로직등을 담으며 데이터를 캡슐화하는 역할View
: 사용자에게 보여지는 화면(UI, 레이아웃)View Model
: 핵심적인 비즈니스 로직으로 View에서 받은 이벤트를 처리하고Binding을 통해 즉시 View로 전달
장점: Binding을 통하여 View와 View Model 간의 의존성까지 최소한 형태
단점: 설계가 복잡하고 간단한 프로젝트에서는 View Model 설계가 오히려 능률이 떨어짐