![](/img/trans.png)
[英]iOS Combine Framework - Publisher Only Publishes Once and Then Never Again
[英]Combine Publisher performs .sink action only once
我有一個帶有以下變量的 ViewModel:
@Published var refreshed: Bool = false
然后,我在列表的刷新視圖中使用這個變量,如下所示:
List {
[code...]
}
.refreshable {
ratingsViewModel.refreshed = true
ratingsViewModel.onRefresh()
}
我的ratingsViewModel
有它的 function onRefresh
,它在每次視圖刷新時觸發(如上):
func onRefresh() {
myCurrentRatingsList
.sink(receiveValue: { [weak self] ratingsList in
print(self?.refreshed)
})
.store(in: &cancellableSet)
}
myCurrentRatingsList 是這樣創建的發布者:
private lazy var myCurrentRatingsList: AnyPublisher<[RatingsListSection: [RatingsListRow]], Never> = {
myCurrentRatingsRepository.ratingsList
.share()
.replaceError(with: [:])
.eraseToAnyPublisher()
}()
問題是 function onRefresh
也在ratingsViewModel
初始化上執行,因此在創建 ViewModel 實例時會打印ratingsViewModel.refreshed
值。 當我通過下拉屏幕在列表上使用可刷新時,沒有打印任何內容(animation 有效)。
我的問題: .sink
只能使用一次嗎? 如果是,我該如何替換它,以便我可以多次更新我的發布者的價值
您的代碼的問題是,您創建的接收器沒有參考,因此一旦 function 執行完成,memory 將被清除,並且接收器不再存在以觸發多次。
private var mySink : AnyCancellable? // keep this variable as class member
func onRefresh() {
mySink = myCurrentRatingsList
.sink(receiveValue: { [weak self] ratingsList in
print(self?.refreshed)
})
.store(in: &cancellableSet)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.