ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Combine - Cancellable
    Combine 2022. 3. 10. 20:00

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 알아보기로한 Combine의 필수요소 중 마지막인 Cancellable에 대해 알아보겠습니다🙋🏻

     

    Cancellable?

    Combine의 Cancellable을 공식문서에서 찾아보면 우선 프로토콜입니다.

    protocol Cancellable

    그럼 어떤걸 하느냐?

    현재의 이벤트 및 작업에 대해 취소에 대해 지원하는 그대로의 의미를 가집니다.

    cancel() 메서드를 호출함으로 리소스에 대해 해제해줍니다.

    타이머, 네트워크 액세스, 디스크I/O와 같은 사이드 이펙트 발생을 중지해줍니다.

     

    그럼 우선 가장 중요한 메서드인 cancel()을 보시죠!

    cancle()

    작업에 대한 취소 메서드로 아래와 같은 간단한 정의를 가집니다.

    func cancel()

    cancel() 호출 시 다운스트림 구독 호출을 중지하도록 해줍니다.

    특징이라면 호출 즉시 바로 취소 적용이 되는점입니다.

    즉 cancel() 메서드가 호출되고나면 후속 호출에서 어떠한 작업도 진행되지 않습니다.

    자 이를 바탕으로 우리는 어떻게 쓰고 있었을까요?

    sink메서드를 호출할때 구현체를 보시면 아래와 같습니다.

    func sink(receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable

    여기서 반환 타입은 AnyCancellable을 볼 수 있습니다.

    즉 실행 후 해당 타입으로 반환해주는걸 볼 수 있어요.

    그럼 AnyCancellable을 알아봐야겠네요!

    AnyCancellable?

    공식문서를 파해쳐 보시죠!

    우선 클래스이며 Cancellable 프로토콜을 따릅니다.

    취소될때 정의한 클로저 블록을 실행해주는 즉 취소를 해주는 객체입니다.

    final class AnyCancellable

    위에서 cancel()을 통해 취소할 수도 있다했죠?

    그런데 이 구현에서는 sink안에서 반환으로 쓰이면 내부적으로 cancel()을 적절하게 호출하도록 되어있습니다.

    즉 해당 객체가 해제될때 cancel()을 자동으로 호출하여 사용됩니다.

    Store 메서드

    또 하나 중요한 메서드로 store(in:) 메서드를 들 수 있겠습니다.

    우선 정의를 보면 아래와 같습니다.

    final func store(in set: inout Set<AnyCancellable>)

    set에 취소 가능한 인스터스를 저장할 집합을 뜻합니다.

    즉 RxSwift의 disposeBag처럼 담는것이라 이해됩니다.

    위에서 sink를 통해 AnyCancellable로 반환된걸 해당 메서드를 체이닝해 하나의 집합에 담아주는걸 의미합니다.

    아래와 같이 호출할 수 있어요!

    var cancellable = Set<AnyCancellable>()
    let subject = PassthroughSubject<Int, Never>()
    
    subject
      .sink(receiveValue: { })
      .store(in: &cancellable)

    간단합니다👍

    요렇게 cancellable로 여러 서브젝트를 취소를 담아주고 한번에 해제할 수 있도록도 구현할 수 있습니다.

    Subscription 객체를 사용해서 취소될 시 해줄 역할을 정의해줄 수도 있고 사용할 수 있습니다.

    마무리

    이렇게 Cancellable까지 알아보면서 필수요소에 대한 학습을 해봤습니다!

    당연히 아직 오퍼레이터 등 다양하게 갈길이 많지만 하나씩 천천히 소화해보는걸 목표로 잡아보면 좋겠습니다😀

    Combine 정말 매력적이네요.

    역시 어려워야 재밌어요🤯

    [참고자료]

    https://developer.apple.com/documentation/combine/cancellable

    https://developer.apple.com/documentation/combine/anycancellable/

     

    Apple Developer Documentation

     

    developer.apple.com

     

    Apple Developer Documentation

     

    developer.apple.com

     

    'Combine' 카테고리의 다른 글

    Combine - multicast / share  (0) 2022.03.24
    Combine - ObservableObject / @Published / @ObservedObject  (0) 2022.03.17
    Combine - Scheduler  (0) 2022.03.07
    Combine - Subject  (0) 2022.02.28
    Combine - Subscriber  (0) 2022.02.24
Designed by Tistory.