I noticed that sink
is called only once
class StorefrontViewModel {
@Published var page = 0
@Published var string = "lorem ipsum"
private var cancellableBag = Set<AnyCancellable>()
init() {
let publisher = $page
.map { [unowned self] in
return $0 == 1 ? self.string.lowercased() : self.string.uppercased()
}
publisher
.eraseToAnyPublisher()
.assign(to: \.string, on: self)
.store(in: &cancellableBag) // must store the subscriber to get the events
}
}
var pager = StorefrontViewModel()
pager.$string.sink { print($0)}
pager.page = 1 // lorem ipsum
pager.page = 2 // LOREM IPSUM
pager.page = 3 // LOREM IPSUM
pager.page = 4 // LOREM IPSUM
pager.page = 1 // lorem ipsum
pager.page = 1 // lorem ipsum
Here is the output LOREM IPSUM
.
Wondering why sink
is called even though I set pager.page
value multiple times
You never stored the cancellation token from sink
so the stream was immediately cancelled. In the future, don't ignore the warning the compiler is giving you.