element๋ค์ ๋ฐฉ์ถํ๋ ์คํธ๋ฆผ์ ๋ค ์ฌ์ฉํ๋ค๋ฉด cancel() ํด์ค์ผ ์์์ด dealloc ๋ ์ ์๋๋ฐ์. ์ฆ ์ด๋ฆ ๊ทธ๋๋ก cancellation(์ทจ์)๋ฅผ ์ํ ํ๋กํ ์ฝ์ ๋๋ค.
๋ง์ฝ cancel()์ ํธ์ถํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์ ?
viewController์ deinit()์ด ํธ์ถ๋๊ณ ๋๋ ์คํธ๋ฆผ์ด ์ด์์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐฉ์ถํ๊ฒ ๋ฉ๋๋ค.
deinit {
print("ViewController deinit")
}
let publisher = [1, 2, 3].publisher
publisher
.map { $0 * 2 }
.sink { value in
print("\(value)")
}
//ViewController deinit
//2
//4
//6
์คํธ๋ฆผ์ด ์ด์์๋ค๋ฉด Timer, network access, disk I/O์ ๊ฐ์ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ตฌ ํ๋ค์.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ์ ์์๊น์ ?
๊ฐ ๋ฐํ ํ cancel()์ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค.
var cancellable: Cancellable?
deinit {
print("ViewController deinit")
cancellable.cancel()
}
let publisher = [1, 2, 3].publisher
cancellable = publisher
.map { $0 * 2 }
.sink { value in
print("\(value)")
}
//ViewController deinit
//2
//4
//6
AnyCancellable์ ํด๋์ค๋ก Cancellable ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ต๋๋ค.
sink๋ก ๊ฐ์ ๋ฐํํ ๋ ๋ฆฌํด ํ์ ์ด AnyCancellable์ ๋๋ค.
public func sink(receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable
์ฌ๋ฌ ์คํธ๋ฆผ์ด ์์๋ cancellable๋ค์ ๋ฐ๋ก cancel() ํ๋๊ฒ์ด ์๋๋ผ ๋์ค์ dealloc์ ํ๋ฒ์ ํ๊ณ cancel() ํ๊ณ ์ถ์๋
cancellable๋ค์ ๋ด์์ค ์ ์๋๋ฐ์. store(in: Set<AnyCancellable>) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ง์น RxSwift์ Disposbag()์ฒ๋ผ cancellable์ ๋ง๋ค์ด๋๋ค Cancellable ์ธ์คํด์ค๋ค์ ๋ด์์ค๋๋ค.
let cancellable = Set<AnyCancellabe>()
deinit {
print("ViewController deinit")
}
let publisher = [1, 2, 3].publisher
cancellable = publisher
.map { $0 * 2 }
.sink { value in
print("\(value)")
}.store(in: self.cancellable)
//ViewController deinit
//2
//4
//6
'IOS๐ > Combine' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Combine] Scheduler๋ (0) | 2023.04.16 |
---|---|
[Combine] ConnectablePublisher (0) | 2022.05.03 |
[Combine] Subject๋ (AnyPublisher) (0) | 2022.04.17 |
[Combine] Combine, Publisher, Subscriber ์ ๋ํด์ (0) | 2022.04.17 |
๋๊ธ