簡體   English   中英

合並 Publisher 只執行一次.sink 操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM