GitHub에서 사용하는 Issue, label, milestone을 관리할 수 있는 앱입니다.
2022.06.13 ~ 2022.07.01
Architecture: MVVM, Clean Architecture
Library: SwiftLint, SnapKit, SwiftyMarkdown
-
Delegate 책임을 ViewController로부터 분리하여 발생하는 불필요한 통신 로직(Delegate/ Observer) 제거
-
기존에 ViewController에 있던 Delegate 역할을 분리하여 새로운 객체를 만들다보니, Delegate 객체와 ViewController간 통신 로직이 필요한 상황이 발생했습니다.
-
이 문제를 해결하고자, TextFieldDelegate의 경우에는 ViewController에서 ViewModel과 Delegate 역할을 할 TextField의 Action과 바인딩을 해주어 TextFieldDelegate를 제거하여 불필요한 통신 로직을 제거할 수 있었습니다.
// EditingIssueViewController func bind(to viewModel: EditingIssueViewModelProtocol) { ... titleViewComponents.titleTextField.addAction( UIAction { [weak self] _ in viewModel.didChangeTitleText(self?.titleViewComponents.titleTextField.text) }) ... }
-
TextView의 경우에는 addAction 메소드를 사용할 수 없기 때문에, Delegate 메소드가 실행될 때 진행될 클로저 타입의 변수를 추가하여 불필요한 통신 로직을 제거할 수 있었습니다.
final class EditingIssueTextViewDelegate: NSObject, UITextViewDelegate { private var onUpdateText: (String) -> Void = { _ in } func setTextViewAction(_ action: @escaping (String) -> Void) { onUpdateText = action } func textViewDidChange(_ textView: UITextView) { onupdate(textView.text) } ... } final class EditingIssueViewController: UIViewController { ... func bind(to viewModel: EditingIssueViewModelProtocol) { ... textViewDelegate.setTextViewAction(viewModel.didChangeContentText(_:)) ... } }
-







