화면 및 컴포넌트 간 데이터 전달의 관점에서 클로저, Delegate, Notification Center, KVO의 장단점을 정리해봄.
개인적으로 느꼈던 점도 포함되어 있고, 줏어 듣거나 참고한 내용도 포함되어 있음.
클로저 (& Completion Handler)
장점
- 쓰기 편하다.
- Swift는 클로저를 1급 객체 취급하므로 객체에 넣어서 사용할 수 있다.
단점
- 에러처리가 복잡해진다. 클로저를 호출하지 않았다고 에러가 뜨진 않기 때문.. -> 메모리 릭이나 누락의 문제가 발생할 수 있음
- 객체로 사용했을 때 뎁스가 깊어져서 가독성이 떨어질 수 있다.
- 소통하는 객체간 결합도(=소통하는 두 객체가 서로의 존재를 인지하는 정도)가 높아짐
Delegate
아마 제일 많이 쓰는 방식일 듯
장점
- 소통하는 객체간 결합도를 낮춤
- 1:1로 데이터를 전달할 때 좋다.
- 데이터 전달의 흐름을 따라가기가 쉬움
단점
- 1:1 관계의 소통이다보니 1:n, n:n 으로 데이터를 전달해야할 때 구현이 복잡해진다. 할 수는 있는데!! 복잡해짐
- 비슷하게 A (부모) - B - C(자식)의 계층 구조가 있는 경우 데이터 전달이 복잡해진다.
- delegate를 지정해주지 않았다고 에러가 뜨진 않기 때문에 신경써야 한다.
NotificationCenter
장점
- 1:n으로 데이터를 전달해야할 때 좋다. 즉, 하나의 값의 변화를 추적해 다른 여러 요소들에 반영해야할 때 좋음
단점
- 1:1 전달에도 사용할 수는 있지만, delegate보다 구현이 복잡함
- 옵저버를 제때 제거해주지 않으면 메모리 릭이 발생할 수 있음
- userInfo, object로 받아오는 값이 Any라서 옵저빙을 추가할 때 어떤 타입을 userInfo로 받아오는 지 별도로 파악하고 있어야 함
- userInfo로 받아올 경우 key값 매칭이 필요한데, key 값이 String이라 어떤 key로 받아오는지도 별도로 파악하고 있어야 함
KVO (Key-Value Observing)
KVO는 dynamic var 키워드를 활용해서 값의 변화를 추적하는 방식임!
⬇️ 아래 글은 잠깐 설명했었던 dynamic var와 동적 디스패치에 관한 글 ⬇️
https://be-beee.tistory.com/59
[Swift] dynamic var, @objc, @NSManaged
궁금한 것은 총 3가지다. 1. dynamic var가 대체 뭐임? 2. dynamic 키워드 앞에 @objc 붙이기도 하고 아니기도 하던데 뭐임? 내가 알던 @objc는 대체 무엇이었던 거임? 3. @NSManaged 얜 또 뭐임... 아래에다가 차
be-beee.tistory.com
장점
- 별도의 key 값이나 value 타입을 파악할 필요가 없음
- 관찰하는 값의 oldValue, newValue 둘 다 제공
- 두 객체 간 동기화 가능
단점
- 옵젝씨 런타임에 의존하게 됨.. 왜냐하면 @objc dynamic var 이니까. (대충 펀쿨섹 끄덕짤)
- (개인적인 생각) willSet, didSet이 이미 있어서 이거에 비해서는 구현 방식이 복잡함..
참고
https://you9010.tistory.com/275
https://shinesolutions.com/2011/06/14/delegation-notification-and-observation/
https://zeddios.tistory.com/1220
'iOS' 카테고리의 다른 글
[iOS] RxSwift 정리 중 (0) | 2023.02.06 |
---|---|
[iOS] 나만 몰랐던 CompositionalLayout 사용기 (0) | 2023.01.04 |
[iOS] UIVisualEffectView 찍먹하기 (0) | 2022.12.17 |
[iOS] CALayer에 CAAnimation 적용하기 (0) | 2022.12.17 |
[iOS] 알고보면 어렵지 않은 커스텀 차트 만들기 (0) | 2022.12.14 |