티스토리 뷰
안녕하세요 밀쿄입니다.
오늘은 어제 예고한대로 Cancellable에 대해서 알아보는 시간을 가져보도록 하겠습니다.
먼저 어제 예시를 다시 보자면
sink의 리턴값이 AnyCancellable입니다
AnyCancellable은 Cancellable란 프로토콜의 Type Erasure한 놈입니다.
그럼 Cancellable을 알면 되겠죠?
https://developer.apple.com/documentation/combine/cancellable
https://developer.apple.com/documentation/combine/anycancellable
애플 문서는 여기입니다.
activity 나 action이 취소가 가능함을 나타내는 프로토롤
쉽게 말하면 이걸 채택하면 취소가 가능하다는 거겠네요.
참고로 AnyCancellable은 Cancellable과 다르게 클래스타입이며
deinitialize가 되면 cancel이 호출된다고 합니다.
그럼 예제를 통해서 한 번 알아보겠습니다
오늘은 이런 예제를 만들겁니다.
그냥 랜덤으로 이미지를 받아오는 녀석입니다
지금은 콤바인 안쓰고 만든 화면입니다.
밑에 콤바인 On을 누르면 콤바인입니다.
down코드 부터 살펴보면
에러가 발생하지 않으면
단순히 이미지뷰에 넣어줍니다.
그리고 캔슬에러만 아니면 대체 이미지를 띄워주는 코드입니다
이렇게 캔슬하면 됩니다..
간단하죠?
근데 문제가 있어요...
여러번 호출할 시 이미지가 너무 자주 바뀐다는 거죠.
이걸 해결할려면 여러 방법이 있겠죠...
이렇게 캔슬할 때마다 downTask을 nil로 만들어주고
downTask가 nil이 아니면
캔슬해주고 nil로 만들어주면 됩니다.
자 이제 콤바인을 봅시다.
개인적으로 위에 코드보다 더 보기 좋아졌다고 생각합니다.
한 줄 한 줄 설명해드리겠습니다
HandEvents는
Publisher의 이벤트가 발생할 때
특정 클로저를 실행시킵니다.
그 중에서 제가 사용한
receiveSubscription은 구독을 전달 받을 때 수행되어지는 클로저 입니다.
즉 구독을 전달받으면 인디케이터를 돌려라 정도 되겠네요
그 다음에 map을 통해서 내려온 데이터를 이미지로 변경합니다
그러고 나서 URLError가 있으면 대체이미지로 변경합니다.
그렇게 내려온 인자는 UIImage?인데 nil이면 대체 이미지로 바꿔줍니다.
그러고 이미지뷰에 뿌려주죠
네 그런 맥락의 코드입니다.
얘도 캔슬은 같습니다 라고 말하고 싶지만
여기서 잠깐..
AnyCancellable는 다음처럼 할 수도 있습니다
이렇게 말이죠?
한 번에 날라갑니다!
이거뿐만 아니라
별도의 작업을 안해도 여러 번 호출할 경우 이전 작업이 캔슬됩니다.
자 이렇게 Cancellable에 대해 알아봤는데요
어떠셨는지모르겠습니다.
예제소스
https://github.com/dp221125/ImageDowloaderWithCombine
참고자료
https://presto95.gitbook.io/combine-rxswift-reactiveswift/
'Combine' 카테고리의 다른 글
CombineLatest (0) | 2020.02.11 |
---|---|
[Combine] Sequence (0) | 2019.12.20 |
[Combine]Just (0) | 2019.12.16 |
[Combine] Scheduler (0) | 2019.12.15 |
Start! Combine (0) | 2019.12.12 |
- Total
- Today
- Yesterday
- 삨
- replaceNil
- combine
- 콤바인
- 스위프트유아이
- BBIK
- 텔큐온
- SEQUENCE
- Apple
- 스위프트
- 현업이그리운
- ErrorHandling
- 알고리즘
- ios
- 스택뷰
- AutoLayout
- MVC
- iOSCombine
- Just
- CombineLatest
- UIViewControllerRepresentable
- SwiftUI
- swift
- Queue
- compactMap
- 결합연산자
- 유니온파인드
- 스유
- 자료구조
- programmers
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |