티스토리 뷰

Swift&IOS

KVO로 MVVM을 짜본다면?

밀쿄 2019. 9. 9. 18:10

안녕하세요. 밀쿄입니다.

요새 MVVM 포스팅이 많아지네요.

 

아무래도 Rx포스팅을 준비 단계에 있어서 더 그런것 같습니다

오늘은 KVO로 MVVM을 만들어볼려고 합니다.

 

일단 그럴려면 KVO가 무엇인가 대해서 알아봅시다

https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key-value_observing_in_swift

 

Using Key-Value Observing in Swift | Apple Developer Documentation

Article Using Key-Value Observing in Swift Notify objects about changes to the properties of other objects. OverviewKey-value observing is a Cocoa programming pattern you use to notify objects about changes to properties of other objects. It's useful for c

developer.apple.com

글 제목에 잘 적혀있습니다.

"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

 

Swift) dynamic이란? / Realm의 dynamic var는?

안녕하세요 :) Zedd입니다. 오늘은 Realm하면서.....자주...보이는... dynamic var.. var는 알겠는데 도대체 이 dynamic이 왜 앞에 붙을까요? 오늘은 dynamic에 대해서 알아봅시다. dynamic dynamic이 사용되는 이..

zeddios.tistory.com

 

다시 본론으로 돌아가서,,.

이렇게 변수를 세개 만들어 줍니다.

 

그리고 이제 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

 

NSKeyValueObservingOptions - Foundation | Apple Developer Documentation

Structure NSKeyValueObservingOptions The values that can be returned in a change dictionary. Declarationstruct NSKeyValueObservingOptions Overview Beta Software This documentation contains preliminary information about an API or technology in development.

developer.apple.com

new의 경우엔

적용 가능한 경우 change Dictionary가

새로운 attribute 값을 제공해야 함을 나타내는 옵션입니다.

 

old의 경우엔
적용 가능한 경우 change Dictionary가 이전 attribute 값이 

포함되어야 함을 나타내는 옵션입니다.

 

initial의 경우엔
지정된 경우 옵저버 registration method가 반환되기 전에

 알림을 옵저버에게 즉시 보내야하는 옵션입니다.

 

prior 경우엔
변경 후 단일 알림 대신 각 변경 전후에 관찰자에게

 별도의 알림을 보내야하는지 여부라고 하네요?

 

하나같이 무슨말인지 모르겠습니다..

그래도 new는 알겠네요.

새로운 값이 들어오면...

(시간이 난다면 이 부분은 보충 포스팅을 해야겠네요)

 

뒤에 붙은 클로저는

changeHandler 라는 녀석입니다.

 

지금 이 상황에선

mainViewModel 이랑 NSKeyValueObservedchange가 내려옵니다

https://developer.apple.com/documentation/foundation/nskeyvalueobservedchange

 

NSKeyValueObservedChange - Foundation | Apple Developer Documentation

Generic Structure NSKeyValueObservedChange SDKs iOS 7.0+macOS 10.9+Mac Catalyst 13.0+BetatvOS 9.0+watchOS 2.0+Xcode 9.0+ Declarationstruct NSKeyValueObservedChange Beta Software This documentation contains preliminary information about an API or technology

developer.apple.com

제네릭 구조체네요.

저는 이 중에서 newValue만 사용한거고..

뷰모델은 사용하지 않아서 _ 처리를 했네요.

 

밑에는 제가 작성한 예제파일입니다.

https://github.com/dp221125/KVO_MVVM_Example-Swift-

 

dp221125/KVO_MVVM_Example-Swift-

Contribute to dp221125/KVO_MVVM_Example-Swift- development by creating an account on GitHub.

github.com

 

참고 자료

위에 로그인 예제는 제가 Rx공부하면서 

곰튀김님의 유튜브 보면서 봤던 에제를 KVO로 구성한 것 입니다,

https://github.com/iamchiwon/RxSwift_In_4_Hours

 

iamchiwon/RxSwift_In_4_Hours

RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기. Contribute to iamchiwon/RxSwift_In_4_Hours development by creating an account on GitHub.

github.com

 

'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
링크
«   2024/11   »
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
글 보관함