티스토리 뷰
안녕하세요. 밀쿄입니다.
요새 MVVM 포스팅이 많아지네요.
아무래도 Rx포스팅을 준비 단계에 있어서 더 그런것 같습니다
오늘은 KVO로 MVVM을 만들어볼려고 합니다.
일단 그럴려면 KVO가 무엇인가 대해서 알아봅시다
글 제목에 잘 적혀있습니다.
"Key-Value Observing"(이하 KVO)
KVO는 다른 Object의 Property 변경에 대해 Object에 알리기 위해 사용하는 Cocoa 프로그래밍 패턴입니다.
모델에서 뷰와 같이 논리적으로 분리 된 앱 부분간에 변경 사항을 전달하는 데 유용합니다.
NSObject에서 상속 된 클래스에만 사용할 수 있습니다.
라고 적혀있네요.
일단 명확하게 하나 알겠는건
NSObject에서 상속 된 클래스에만 사용할 수 있습니다.
이 부분에서 NSObject를 상속받아야겠다라는건 알겠네요.
참고로
UIViewController는 UIResponder를 상속받는데
UIResponder가 NSObject를 상속받습니다.
여기까지 알아봤으니 사용법도 공부할겸
적용해봅시다.
순서는 대강..
뷰 구성( SubView 배치만 )
뷰 모델 구성
뷰 구성 ( 코드 부분 )
뷰는 이렇게 대강 생겼습니다.
이제 뷰모델을 구성하러 가겠습니다.
그 전에 생각해봅시다.
뷰모델엔 뭐가 있어야할지..고민해봅시다
1) id가 vaild한지 체크한 값을 가지고 있는 프로퍼티
2) password가 vaild한지 체크한 값을 가지고 있는 프로퍼티
3) 그 두개가 and 연산한 값을 저장하고 있는 프로퍼티
4) id가 vaild한지 체크하는 함수
5) password가 vaild한지 체크하는 함수
이 정도 있으면 되겠네요.
여기서 주의할 점이
3번 같은 경우엔 값이 변경되면
뷰코드에서 감지해야하는 값입니다.
즉 kvo를 적용해야하는 프로퍼티인거죠
저 글을 읽어보시면 아시겠지만
kvo로 사용하고 싶으면
@objc dynamic을 붙여주셔야합니다.
dynamic은 dynamic dispatch 를 활성화 시키는 선언자정도라고 생각하시면 됩니다.
dynamic이 뭐냐고 하면..
참고 자료 띄위겠습니다.
제가 설명하는 것보다 잘 설명되어있습니다.
https://zeddios.tistory.com/296
다시 본론으로 돌아가서,,.
이렇게 변수를 세개 만들어 줍니다.
그리고 이제 and연산을 해줘야하는데요?
idVaild나 paaswordVaild가 변경될 때마다 해줘야하니까,...
이렇게 만들어주면 되겠죠?
이제 idVaild랑 passwordVaild는 체크하는 함수는
대충 만드시면 됩니다.
사실 Vaild 기준은 정해진게 없어서
저는 대충 짰습니다.
정말 허접한 기준이네요.
이렇게하면 뷰모델은 다만들었습니다.
뷰코드로 가겠습니다.
이렇게 초기화될 떄 뷰모델을 생성해주고
IBAction을 따서 UITextField값이 변경 될때마다 체크를 해줍니다.
참고로 IBAction 딸 때 Editing Chagned로 따야합니다.
그 다음엔
NSKeyValueObservation 타입의 전역변수를 하나 만들어 줍니다.
(이 글에선 observation 입니다. )
이렇게 사용하시면 됩니다.
뷰모델에 observe를 걸고
(\.프로퍼티이름) -> 이게 KeyPath죠.
옵션을 주고 쓰는거죠.
옵션에는 new, old, initial, prior 가 있습니다.
https://developer.apple.com/documentation/foundation/nskeyvalueobservingoptions
new의 경우엔
적용 가능한 경우 change Dictionary가
새로운 attribute 값을 제공해야 함을 나타내는 옵션입니다.
old의 경우엔
적용 가능한 경우 change Dictionary가 이전 attribute 값이
포함되어야 함을 나타내는 옵션입니다.
initial의 경우엔
지정된 경우 옵저버 registration method가 반환되기 전에
알림을 옵저버에게 즉시 보내야하는 옵션입니다.
prior 경우엔
변경 후 단일 알림 대신 각 변경 전후에 관찰자에게
별도의 알림을 보내야하는지 여부라고 하네요?
하나같이 무슨말인지 모르겠습니다..
그래도 new는 알겠네요.
새로운 값이 들어오면...
(시간이 난다면 이 부분은 보충 포스팅을 해야겠네요)
뒤에 붙은 클로저는
changeHandler 라는 녀석입니다.
지금 이 상황에선
mainViewModel 이랑 NSKeyValueObservedchange가 내려옵니다
https://developer.apple.com/documentation/foundation/nskeyvalueobservedchange
제네릭 구조체네요.
저는 이 중에서 newValue만 사용한거고..
뷰모델은 사용하지 않아서 _ 처리를 했네요.
밑에는 제가 작성한 예제파일입니다.
https://github.com/dp221125/KVO_MVVM_Example-Swift-
참고 자료
위에 로그인 예제는 제가 Rx공부하면서
곰튀김님의 유튜브 보면서 봤던 에제를 KVO로 구성한 것 입니다,
https://github.com/iamchiwon/RxSwift_In_4_Hours
'Swift&IOS' 카테고리의 다른 글
NotificationCenter (0) | 2019.10.01 |
---|---|
@discardableResult (0) | 2019.09.24 |
UITableView에서 MVVM을 어캐 적용하면 좋을까? (0) | 2019.09.06 |
type(of: ) (0) | 2019.09.04 |
Swift로 간단하게 화씨를 섭씨로, 섭씨를 화씨로 변환해보자 (0) | 2019.08.29 |
- Total
- Today
- Yesterday
- SEQUENCE
- Queue
- 콤바인
- Apple
- combine
- Just
- MVC
- 결합연산자
- 알고리즘
- ErrorHandling
- iOSCombine
- 스택뷰
- 스위프트유아이
- 유니온파인드
- SwiftUI
- 텔큐온
- programmers
- ios
- AutoLayout
- compactMap
- 현업이그리운
- 삨
- BBIK
- swift
- 스유
- replaceNil
- 자료구조
- 스위프트
- CombineLatest
- UIViewControllerRepresentable
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |