Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 绑定到多个视图的单例发布服务器 概述_Swift_Swiftui_Combine - Fatal编程技术网

Swift 绑定到多个视图的单例发布服务器 概述

Swift 绑定到多个视图的单例发布服务器 概述,swift,swiftui,combine,Swift,Swiftui,Combine,我的应用程序具有偏爱对象的功能。有多个视图需要访问[Favorite]才能呈现UI以及添加和删除它们 我想要一个[收藏夹]的单一来源,其中: 所有视图都基于它呈现UI 更新此源会向订阅它的所有视图发出信号,并根据更新后的值重新提交 每次更新时,源代码都会保存在UserDefaults 从UI更新收藏夹也会更新单例的源代码,因此需要更新其他视图 尝试1 我试图使用@Binding链接源代码,但当源代码更改时,它不会更新UI class Singleton { static let sha

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

我想要一个
[收藏夹]
的单一来源,其中:

  • 所有视图都基于它呈现UI
  • 更新此源会向订阅它的所有视图发出信号,并根据更新后的值重新提交
  • 每次更新时,源代码都会保存在
    UserDefaults
  • 从UI更新收藏夹也会更新单例的源代码,因此需要更新其他视图

  • 尝试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)
            })
        }
    }
    
    类单例{
    静态let shared=Singleton()
    var favorites=CurrentValueSubject(someFavorites)
    }
    类ViewModel:ObservableObject{
    @绑定变量收藏夹:[收藏夹]
    init(){
    _收藏夹=绑定(在中获取:{()->[Favorite]
    Singleton.shared.favorites.value
    },设置:{newValue in
    Singleton.shared.favorites.send(newValue)
    })
    }
    }
    

    尝试2 我还尝试使用
    发布者
    订阅者
    创建绑定,但最终会出现无限循环



    提前感谢

    这里是可能的方法。使用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)
        }
    }
    
    类单例{
    静态let shared=Singleton()
    //根据需要配置设置初始值,[]用于测试
    var favorites=CurrentValueSubject([])
    }
    类ViewModel:ObservableObject{
    @已发布的变量收藏夹:[收藏夹]=[]
    private var cancelables=Set()
    init(){
    Singleton.shared.favorites
    .receive(在:DispatchQueue.main上)
    .sink中的{[弱自我]值
    self?.favorites=值
    }
    .store(在:&可取消项中)
    }
    }
    
    更新主队列中的用户界面。感谢您的评论,代码肯定会自动将用户界面更新为Singleton的源代码更新。然而,我必须道歉,因为我没有包括我的第四个要求。我希望在视图更新源代码时更新Singleton的源代码,从而向其他视图发送更新信号。本质上是将ViewModels的源绑定到Singleton的源。