Combine3-Cancellable

2023. 7. 9. 16:41·반응형프로그래밍

Combine을 공부하다보면 Cancellable이라는 프로토콜을 자주 만나게 된다. 먼지도 모르고 그냥 쓰는 것은 내가 제일 싫어하는 것이기에 공부 바로 시작

Cancellable

"A protocol indicating that an activity or action supports cancellation."
취소를 지원하는 활동 혹은 액션을 나타내는 프로토콜

..? 이거 보고 이해하는 사람 있나여? 일단 나는 아님

  • Combine에선 이벤트 스트림을 action이라하는데 이 것을 취소할수 있는 프로토콜이라고 한다.
public protocol Cancellable {
    func cancel()
}

실제로는 구독의 라이프사이을 관리하는 매커니즘을 제공합니다.구독을 취소하면?:
- 퍼블리셔는 더 이상 값을 생성하지 않음.

- 구독자는 더 이상 값을 받지않음

- 관련된 모든 리소스 해제

요것이 Combine 반응형 프로그래밍에서 메모리 누수 방지하는 매커니즘

AnyCanclleable

final public class AnyCancellable: Cancellable, Hashable {
    public init(_ cancelAction: @escaping () -> Void)
    public func cancel()
    deinit { cancel() }
}
  • type erasure: Combine에서 퍼블리셔와 구독자 간의 구체적인 타입을 숨기고, 일반화된 형태로 다룰수잇다
  • 자동취소: 객체가 메모리에서 해제될때 자동으로 cancel

1.이 클래스는 Cancellable 프로토콜 채택, Hashable 프로토콜도 채택하여 컬렉션에 저장 가능

2. 초기화 시 클로저를 받아 취소 작업 정의,

3. 소멸시 자동으로 cancel()호출 

이전의 sink로 구독을 하면 리턴값이 AnyCancellable 클래스이다

let publisher = [1, 2, 3].publisher
let cancellable = publisher.sink { value in
    print("Received: \(value)")
}
// cancellable은 AnyCancellable 타입
cancellable.cancel() // 필요 시 수동으로 취소

만약 구독을 계속 유지하고 싶다면 AnyCancellable인스턴스를 어딘가에 저장해야한다!!!!!!

store(in:)

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

AnyCancellable 인스턴스를 저장한다. Set에 저장된 AnyCancellable이 메모리에서 해제되면 자동으로 취소되므로 따로 cancel해줄필요가없다.

 

예상 질문

Cancellable프로토콜과 AnyCancellable class 차이점은?

- Cancellable은 취소 가능한 작업을 나타내는 프로토콜로 단일 메서드 cancel()만 요구한다. 

- AnyCancellable은 구체적인 클래스로 타입지우개 패턴을 구현하여 Cancellable프로토콜, Hashable protocol채택하여 Set등의 컬렉션에 저장가능하고 소멸자에서 자동으로 cancel()을 통해 ARC로 메모리 관리 가능.

타입지우개는 왜필요한가요?

- Combine에서 퍼블리셔 구독자는 다양한 타입으로 존재. ex)PassThroughSubejct<Int,Never>, PassThorughSubject<Stirng,Never>. 등 이런타입을 일일이 관리하려면 코드 복잡해진다. AnyCancellable은 이런 구체적인 타입을 지워버리고 단일 코드로 통합하게 해줌.

 

Anycancellable set에 저장하는 이유?

- 구독을 한곳에서 관리하기 위해. Set에 저장된 AnyCancellable인스턴스는 ARC에 의해 참조가 해제되면 cancel()이 호출되어 구독을 수동으로 해제할필요가없다. 

  • Set으로 왜햇지?
    • 구독을 관리할때 동일한 AnyCancellable 인스턴스 여러번 저장되는 상황이 의미가 없기에. 구독은 독립적이고 고유한 작업 단위

 

'반응형프로그래밍' 카테고리의 다른 글

RxSwift(3)-Filtering Operators & TransForming Operators  (0) 2025.04.29
RxSwift(2)-Subject  (0) 2025.04.29
RxSwift(1)-Observable  (1) 2025.04.28
Combine(2)- Operator  (1) 2023.10.08
Combine(1)-WhatisCombine(publish&subscirbe)  (0) 2023.07.09
'반응형프로그래밍' 카테고리의 다른 글
  • RxSwift(2)-Subject
  • RxSwift(1)-Observable
  • Combine(2)- Operator
  • Combine(1)-WhatisCombine(publish&subscirbe)
2료일
2료일
좌충우돌 모든것을 다 정리하려고 노력하는 J가 되려고 하는 세미개발자의 블로그입니다. 편하게 보고 가세요
  • 2료일
    GPT에게서 살아남기
    2료일
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • SWIFT개발 (30)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (31)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
      • CS (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    combine
    티스토리챌린지
    Coremotion
    UDP
    socket
    operators
    SwiftUI
    kingfisher
    ios
    Protocol
    METAL
    Python
    RxSwift
    image
    알고리즘
    Swift
    uikit
    오블완
    CoreLocation
    HIG
    shader
    Dependency
    filter
    비동기
    TCA
    Vapor
    actor
    TCP
    프로그래머스
    cs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
2료일
Combine3-Cancellable
상단으로

티스토리툴바