티스토리 뷰

🍏/SwiftUI + Combine

[Combine] Cancellable과 AnyCancellable

사용자 eungding 2019. 6. 28. 23:32
728x90
반응형

 

viewController가 deinit 될때, 그 안의 Pulisher가 auto-cancel 되는지 실험해봅시다 --! 

5초 후에 이벤트를 발행하는 Publisher와 3초 후에 deinit되는 viewController가 있습니다

 

1) stream을 안담아줄 때 

viewController가 deinit되어도 스트림이 살아있습니다 

 

 

2) stream을 Cancellable에 담아줄 때 

viewController가 deinit되어도 여전히 스트림이 살아있습니다 

 

3) stream을 Cancellable에 담아주고 deinit 때 cancel 시켜줄 때 

이렇게 deinit 될때 cancel시키는 코드를 넣어줘야지 스트림이 같이 끝납니다

 

4) stream을 AnyCancellable에 담아줄 때 

AnyCancellable에 담아줘야지 deinit 될 때 auto-cancel 됩니다 

AnyCancellable로 스트림의 메모리 관리를 해줘야합니다...!! 

 

 

Cancellable과 AnyCancellable이 어떻게 다른 지는  RxSwift vs Combine - 스펙 / 성능 / 개념 비교 이 포스팅에 적어두었구요

왜 이런 차이가 나는 지는 저도 잘 모르겠습니다 😭 누가 좀 알려주세요오... 정말 궁금..

728x90
반응형
댓글
  • 프로필사진 미스테리 왜 위 글이 재현이 안될까요...위에 글 코드대로 작성하니까 그 어느 경우에도
    This ViewController is Deinit
    is Alive?
    finished
    로 호출이 되네요
    2019.12.16 13:17
  • 프로필사진 사용자 eungding 안녕하세요!_!
    4번의 코드를 복붙하여서 돌려봤는데용,
    (지금은 Publisers.Just 컴파일 에러 떠서 Just로 고친 후!! ==> 6월 이후로 바뀌었나봐요!)

    저는 viewController deinit 만 프린트 됩니당!!
    혹시 몰라 제가 복붙해서 돌린 코드 또 써볼게용!


    class ViewController: UIViewController {

    var cancellable: AnyCancellable?

    deinit {
    print("viewController deinit")
    }

    override func viewDidLoad() {
    super.viewDidLoad()

    let stream = Just("is Alive?")
    .delay(for: .seconds(5), scheduler: RunLoop.main)
    .sink(receiveCompletion: { (completion) in
    switch completion {
    case .finished: print("finished")
    case .failure(let error): print(error)
    }
    }, receiveValue: {
    print($0)
    })

    cancellable = AnyCancellable(stream)

    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    UIApplication.shared.keyWindow?.rootViewController = nil
    }
    }
    }

    2019.12.16 20:24 신고
  • 프로필사진 미스테리 https://user-images.githubusercontent.com/10572119/71047693-f567b880-217f-11ea-884b-1b5077d400f9.png

    이 코드를 돌려봐도 저는 viewController deinit만 호출 되지 않네요//
    2019.12.18 10:22
  • 프로필사진 사용자 eungding 혹시 돌려보신 XCODE 버전이 어떻게 되세요?_?

    저는 아무리 돌려봐도
    viewController deinit 만 출력되어서
    다른 XCODE 버전에서 한번 돌려보고 싶어서요!!
    (상관없을 수도 있지만...!혹시나..!!)

    참고로 제 XCODE 버전은 11.2.1 입니다 ☺️
    2019.12.19 20:16 신고
  • 프로필사진 미스테리 제 버전은 11.3 입니다 2019.12.20 01:53
  • 프로필사진 사용자 eungding 안녕하세요!
    혹시 iOS 13.2 시뮬레이터를 다운받아서 돌려보시겠어요?_?
    (Preference -> Componets에 들어가시면 낮은 버전의 시뮬레이터를 다운받으실 수 있습니다!)


    XCODE 11.3을 다운받아서 돌려봤는데,
    iOS 13.3 부터 Cancellable 관련해서 뭔가 바뀐 것 같아요!
    iOS 13.1과 iOS13.2는 출력안되는데,
    iOS 13.3에서는 출력되더라구요 😱

    Combine 내부 구현이 어떻게 바뀌었는지 보고 싶은데,

    https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_3_release_notes

    여기 릴리즈 노트에는 그런 내용이 없고
    궁금한데 어디서 찾아봐야할지 모르겠네요!!ㅠㅠㅠㅠㅠㅠㅠ

    어떻게 이럴 수 있지..

    더 기가막힌 것은 13.3에서
    private var cancelBag = Set<AnyCancellable>()
    stream.store(in: &cancelBag)
    이렇게 해도
    출력된다는 사실이에요....

    더 찾아보고 알게 되는 것이 있으면 답글달게요-!
    혹시 미스테리님도 알게 되는 것이 있으면 알려주시면 감사하겠습니다(꾸벅)
    2019.12.21 17:04 신고
댓글쓰기 폼