具有绑定到多个视图的Singleton发布者

时间:2020-05-11 09:17:08

标签: swift swiftui combine

概述

我的应用程序具有收藏对象的功能。有多个视图需要访问[Favorite]才能呈现UI以及添加和删除UI。

我希望有一个[Favorite]的来源,

  1. 所有视图均基于该视图呈现UI
  2. 更新此源表示所有订阅了该视图的视图,并根据更新后的值重新呈现
  3. 每次更新时,源均保存在UserDefaults
  4. 从用户界面更新收藏夹也会更新Singleton的来源,因此,其他视图也要更新

尝试1

我尝试使用@Binding链接源,但是更改源时它不会更新UI。

class Singleton {
    static let shared = Singleton()

    var favorites = CurrentValueSubject<[Favorite], Never>(someFavorites)
}


class ViewModel: ObservableObject {
    @Binding var favorites: [Favorite]

    init() {
        _favorites = Binding<[Favorite]>(get: { () -> [Favorite] in
            Singleton.shared.favorites.value
        }, set: { newValue in
            Singleton.shared.favorites.send(newValue)
        })
    }
}

尝试2

我还尝试使用PublishersSubscribers创建绑定,但是最终陷入无限循环。


预先感谢

1 个答案:

答案 0 :(得分:3)

这是可行的方法。经过Xcode 11.5b2的测试。

class Singleton {
    static let shared = Singleton()

    // configure set initial value as needed, [] used for testing
    var favorites = CurrentValueSubject<[Favorite], Never>([])
}


class ViewModel: ObservableObject {
    @Published var favorites: [Favorite] = []

    private var cancellables = Set<AnyCancellable>()

    init() {
        Singleton.shared.favorites
            .receive(on: DispatchQueue.main)
            .sink { [weak self] values in
                self?.favorites = values
            }
            .store(in: &cancellables)
    }
}