apple/DesignPattern & Architecture

[Swift] Observer Pattern

lgvv 2022. 4. 19. 02:01

Observer Pattern

 

✅ Observer Pattern

 

아래의 문서를 구입하여 영어 문서를 번역하고 이해한 것을 바탕으로 글을 작성하고 있습니다.

 

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/8-observer-pattern

 

Design Patterns by Tutorials, Chapter 8: Observer Pattern

The observer pattern lets one object observe changes on another object. You’ll learn two different ways to implement the observer pattern in this chapter: using key value observation (KVO), and using an `Observable` wrapper.

www.raywenderlich.com

 

 

 

✅ Observer Pattern

 

관찰자 패턴을 사용하면 한 객체가 다른 객체의 변경 사항을 관찰할 수 있습니다.

애플은 Swift 5.1에서 언어 수준에서 이 디자인 패턴을 도와주는 Combine 프레임워크 내에 Publisher를 추가했어요.

 

 

옵저버 패턴!

 

이 패턴에는 3가지 부분으로 나뉩니다.

1. Subscriber는 "관찰자(Observer)" 객체이며 업데이트를 수신합니다.

2. Publisher는 "관찰 가능한(Observable)" 객체이며 업데이트를 보냅니다.

3. Value는 변경된 기본 객체입니다. 

 

+ 참고 +

이번 포스팅에서는 @Published 속성에 대한 높은 수준의 소개를 제공하나, Combine 프레임워크에서 제공되는 모든 세부 사항이나 강력한 기능을 다루지는 않습니다. 더 자세히 알고 싶다면 다른 책을 참고해주세요!

 

https://www.raywenderlich.com/books/combine-asynchronous-programming-with-swift

 

Combine: Asynchronous Programming with Swift

<h2>Master declarative asynchronous programming with Swift using the Combine framework!</h2> <p>Writing asynchronous code can be challenging, with a variety of possible interfaces to represent, perform, and consume asynchronous work — delegates, notifica

www.raywenderlich.com

 

✅ When should you use it?

다른 객체에 대한 변경사항을 수신해야 할 때마다 관찰자 패턴을 사용합니다.

 

이 패턴은 ViewController에 Subscriber(구독자)가 있고 Publisher가 있는 MVC 패턴과 함께 자주 사용됩니다. 이를 토앻서 Model은 ViewController의 타입(유형)에 알 필요 없이 ViewController에 변경 사항을 전달할 수 있습니다. 따라서 다른 ViewController가 동일한 model 유형에서 변경 사항을 사용하고 관찰할 수도 있습니다!

 

Playground example

우리는 행동 패턴 아래에 관찰자가 나열되는 것을 확인할 수 있습니다. 옵저버는 다른 객체를 관찰하는 한 객체에 대한 것입니다. 

 

// 1
import Combine

// 2
public class User {
    
    // 3
    @Published var name: String
    
    // 4
    public init(name: String) {
        self.name = name
    }
}

위에서 수행한 작업은 아래 설명과 같습니다.

1. 먼저 Combine 프레임워크를 import합니다. 그리고 이 프레임워크는 Publisher, Subsciber, @Published를 포함하고 있습니다.

2. 다음으로 User 클래스를 선언하고 @Published 속성은 구조체 또는 클래스 이외의 다른 유형에서 사용할 수 없습니다.

3. 다음으로 프로퍼티를 var로 만들고 name이라고 변수의 이름을 지정합니다. 그리고 @Published를 mark합니다. Xcode는 자동으로 Publisher에 대해 생성하도록 지시합니다.

(@Published는 let과 함께 사용할 수 없습니다.)

4. 마지막으로 초기화하는 init을 만듭니다.

 

// 1
let user = User(name: "Ray")

// 2
let publisher = user.$name

// 3
var subscriber: AnyCancellable? = publisher.sink() {
    print("User's name is \($0)")
}

// 4
user.name = "Vicki"

위의 코드는 아래 설명과 같습니다.

1. 먼저 User 클래스에 대한 인스턴스를 init으로 Ray라는 이름을 주어 만듭니다.

2. 다음으로 user.$name을 통해 사용자 이름에 대한 변경 사항을 브로드캐스틍 하기 위해 publisher에 접근합니다. Published<String>.Publisher 유형의 객체를 반환합니다. 이 객체는 업데이트를 대신 (listened) 해줍니다. 

3. 다음으로 publisher에서 sink를 호출하여 subscriber를 만듭니다. 이것은 초기 값과 값이 변경될 때마다 호출되는 클로저를 취합니다(take!). 기본적으로 sink는 AnyCancellable 타입을 반환합니다. 그러나 이 타입을 AnyCancellable?(옵셔널타입)으로 선언해야 하는데, 나중에 삭제(nil)해야 하므로 옵셔널 타입으로 명시합니다.

4. 그럼 이제 user의 이름을 Vicki로 변경합니다!!

 

아래와 같이 콘솔에 찍히게 됩니다.

User's name is Ray
User's name is Vicki

다음으로 아래 코드를 수행해보자.

subscriber = nil
user.name = "Ray has left the building"

subscriber를 nil로 설정하면 더이상 publisher로 부터 update를 받을 수 없습니다. 이것을 증명하기 위해 user의 이름을 마지막으로 변경하지만 콘솔에는 새로운 출력이 표시되지 않습니다.

 

 * (개인적인 견해) 여기까지 공부했을 때, 옵저버 패턴은 정말 rxswift와 닮아 있습니다. combine을 적용하는 것도 rx를 이미 공부한 상태에서 적용하니 그리 어려울 것 같지 않습니다. subscriber를 nil로 만드는 것은 rx에서 dispose하는 것과 같은 개념으로 이해할 수 있습니다. 

 

✅ What should you be careful about?

 

옵저버 패턴을 구현하기 전에 변경될 것으로 예상되는 것들을 미리 정의하세요. 객체나 프로퍼티가 변경되는 이유를 식별할 수 없는 경우에는 var또는 @Published로 선언하지 않고 대신 let 속성으로 만드는 것이 더 좋습니다. 

예를 들어서 유니크한 아이디(고유한 식별자, 주민등록번호 같은 것들)은 정의상 변경되지 않아야 하므로 published 프로퍼티로 사용할 수 없습니다.

 

Tutorial project

 

https://github.com/lgvv/DesignPattern/tree/main/observer-pattern/RabbleWabble

 

GitHub - lgvv/DesignPattern: ✨ 디자인 패턴을 공부합니다!

✨ 디자인 패턴을 공부합니다! Contribute to lgvv/DesignPattern development by creating an account on GitHub.

github.com

 

 

 * (개인적인 견해) RxSwift를 공부하면서 Combine이랑 정말 비슷함을 느꼈다. 그래서 인지 옵저버 패턴은 이벤트 기반 프로그래밍을 한층 더 성숙하게 이해할 수 있었던 것 같다 !_! 

주석으로 달아주었으니까, 꼭 확인해보자 어렵지 않다 !!! 

 

✅ Key points

 

이번에는 옵저버 패턴에 대해서 배웠다.

 

1. 옵저버 패턴은 한 객체가 다른 객체의 변경 사항을 관찰할 수 있다. 여기에는 publisher와 subscriber 그리고 value가 포함된다.

2. subscriber는 관찰자(observer)다. publisher는 관찰가능한(observable) 객체이다. value는 변경중인 객체이다.

3. Swift 5.1에서는 프로퍼트를 사용하여 옵저버 패턴을 쉽게 구현할 수 있다. 이에는 @Published가 있다.

 

 

 

 

 

 

'apple > DesignPattern & Architecture' 카테고리의 다른 글

[Swift] MVVM Pattern  (0) 2022.04.26
[Swift] Builder Pattern  (0) 2022.04.22
[Swift] Memento Pattern  (0) 2022.04.13
[Swift] Strategy Pattern  (0) 2022.04.11
[Swift] Delegation Pattern  (0) 2022.04.10