티스토리 뷰

728x90
반응형

 

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

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

 

1) stream을 안담아줄 때 

class ViewController: UIViewController {
deinit {
print("viewController deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
let stream = Publishers.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)
})
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
UIApplication.shared.keyWindow?.rootViewController = nil
}
}
<output>
viewController deinit
is Alive?
finished

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

 

 

2) stream을 Cancellable에 담아줄 때 

class ViewController: UIViewController {
var cancellable: Cancellable?
deinit {
print("viewController deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
let stream = Publishers.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 = stream
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
UIApplication.shared.keyWindow?.rootViewController = nil
}
}
<output>
viewController deinit
is Alive?
finished

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

 

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

class ViewController: UIViewController {
var cancellable: Cancellable?
deinit {
print("viewController deinit")
cancellable?.cancel()
}
override func viewDidLoad() {
super.viewDidLoad()
let stream = Publishers.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 = stream
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
UIApplication.shared.keyWindow?.rootViewController = nil
}
}
<output>
viewController deinit

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

 

4) stream을 AnyCancellable에 담아줄 때 

class ViewController: UIViewController {
var cancellable: AnyCancellable?
deinit {
print("viewController deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
let stream = Publishers.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
}
}
<output>
viewController deinit

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

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

 

 

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

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

반응형
댓글