combine
combine은 발행하는 Publisher, 구독하는 Subscriber 로 나뉘어 비동기 이벤트를 처리하기 위한 프레임워크이다.
비슷한 기능으로 rx가 있지만 combine은 애플에서 직접 제공한 프레임워크이기 때문에 추후에 rx보단 combine이 쓰이게 될 확률이 높다!
Publisher는 간단하게 데이터를 제공하는 입장이라고 보면 된다. Output, Failure 타입을 제네릭 형태로 정의하고 있으며, Subscriber 한개 혹은 여러개에게 데이터를 발행할 수 있다.
Subscriber는 Publisher는 반대로 데이터를 구독하는 입장이다. Input, Failure 타입을 제네릭 형태로 정의하고 있으며, Publisher에게 데이터를 받을 수 있도록 하는 역할을 한다.
그리고 Operator는 Publisher와 Subscriber 사이에서 데이터를 가공하여 전달하는 역할을 한다.
이렇게 개념들로만 이해를 하기에는 무리가 있어 유튜브에서 예시 코드를 가져와 이해해봤다.
var mySubscription: AnyCancellable?
var mySubscriptionSet = Set<AnyCancellable>()
var myNotification = Notification.Name("com.zzzanghyeon.customNotification")
var myDefaultPublisher : NotificationCenter.Publisher = NotificationCenter.default.publisher(for: myNotification)
mySubscription = myDefaultPublisher.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("완료")
case .failure(let error):
print("실패 : error : \(error)")
}
}, receiveValue: { receriverValue in
print("값을 받았다. : \(receriverValue)")
})
mySubscription?.store(in: &mySubscriptionSet)
NotificationCenter.default.post(Notification(name: myNotification))
mySubscription을 AnyCancellable타입으로 정의해 구독을 취소 및 실행하는 역할을 한다.
mySubscriptionSet은 구독을 저장하고 유지하는데 사용된다.
그리고 Notification을 발행하는 Publisher를 생성한 후, Notification이 발생할 때 해당 이벤트를 구독할 수 있게 해준다.
sink를 통해 구독할 수 있으며, 마지막으로 .store를 사용하여 mySubscriptionSet에 구독을 저장하여 수동으로 관리하지않고 (수동으로는 mySubscription?.cancel() 이런식으로 메모리에서 해제해야함)
자동으로 메모리에서 해제할 수 있게끔 관리해준다. .store를 저런식으로 분리하여 사용해도 되지만 sink 코드를 사용할 때 후미에 붙여 사용해도 된다.