combine

김정현·2023년 12월 11일
0

IOS 개발공부 일지

목록 보기
27/27

combine

combine은 발행하는 Publisher, 구독하는 Subscriber 로 나뉘어 비동기 이벤트를 처리하기 위한 프레임워크이다.

비슷한 기능으로 rx가 있지만 combine은 애플에서 직접 제공한 프레임워크이기 때문에 추후에 rx보단 combine이 쓰이게 될 확률이 높다!

Publisher

Publisher는 간단하게 데이터를 제공하는 입장이라고 보면 된다. Output, Failure 타입을 제네릭 형태로 정의하고 있으며, Subscriber 한개 혹은 여러개에게 데이터를 발행할 수 있다.

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 코드를 사용할 때 후미에 붙여 사용해도 된다.

0개의 댓글