-
Combine - CancellableCombine 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/
'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