我注意到sink
只被调用一次
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
这是LOREM IPSUM
的输出。
想知道为什么sink
被调用,即使我多次设置pager.page
值
您从未存储来自sink
的取消令牌,因此流立即被取消。以后,不要忽略编译器给你的警告。