Swift 如何通知消费者服务状态已更改

Swift 如何通知消费者服务状态已更改,swift,state,Swift,State,我有一个服务,有点像下面。当我请求一个用户配置文件时,我将其作为服务中的本地缓存存储在一个集合中。然后,我检查它是否存在于后续请求中,如果存在,则返回它 我在服务上有另一个方法更新用户配置文件。此更改的响应将获得一个新的、更新的user副本。然而,该服务被注入到两个不同的视图模型中,它是同一个实例,因为它是在链的更高层创建的。它不是一个单例实例 如果控制器A呈现fetchUserProfile的结果,而控制器B呈现updateText的结果,那么当用户:[String:User]发生更改时,如何

我有一个服务,有点像下面。当我请求一个用户配置文件时,我将其作为服务中的本地缓存存储在一个集合中。然后,我检查它是否存在于后续请求中,如果存在,则返回它

我在服务上有另一个方法更新用户配置文件。此更改的响应将获得一个新的、更新的
user
副本。然而,该服务被注入到两个不同的视图模型中,它是同一个实例,因为它是在链的更高层创建的。它不是一个单例实例

如果控制器A呈现
fetchUserProfile
的结果,而控制器B呈现
updateText
的结果,那么当
用户:[String:User]
发生更改时,如何更新控制器A

我需要一种方法来通知服务中的某些更改

我确实考虑了一些简单的东西,比如一个闭包,并调用它。代码> DIDSET 但不确定这是正确的方法还是更好的处理? 差不多-

private-var-users:[字符串:用户]=[:]{
didSet{
usersChange?(用户)
} 
}
但随后我想在这个集合上引入某种基于时间的逐出,调用
didSet
没有多大意义,我还觉得在这一点上,服务的每个输出都会分布在方法和这个闭包/绑定中

    final class ProfileService: ProfileServiceType {

        private let client: Client<InternalEndpoints>
        private var users: [String: User] = [:] 

        enum ProfileServiceError: Error {
            case invalidMediaPayload
        }

        init(client: Client<InternalEndpoints>) {
            self.client = client
        }

        func fetchUserProfile(byId userId: String) -> Promise<User> {

            if let cached = users[userId] {
                return .value(cached)
            }

            return client
                .request(.getUserProfile(userId: userId))
                .get { [weak self] in self?.users[userId] = $0 }
        }

        func updateText(forUser userId: String, with text: String) -> Promise<User> {

            return client
                .request(.updateProfileText(userId: userId, text: text))
        }

}
final类ProfileService:ProfileServiceType{
私人出租客户:客户
私有变量用户:[字符串:用户]=[:]
enum ProfileServiceError:错误{
案例无效
}
初始化(客户端:客户端){
self.client=client
}
func fetchUserProfile(byId userId:String)->Promise{
如果let cached=users[userId]{
return.value(缓存)
}
返回客户端
.request(.getUserProfile(userId:userId))
.get{[weak self]在self?.users[userId]=$0}
}
func updateText(forUser userId:String,带text:String)->Promise{
返回客户端
.request(.updateProfileText(userId:userId,text:text))
}
}

我不确定这是否是您想要的,但KVO或委派可能会帮助您实现您想要的。如果我是您,我会使用核心数据或领域。然后,您可以只观察持久层中的更改。您共享
档案服务的实例有什么原因吗?这似乎不是个好主意。无论如何,当然,您可以像上面那样使用闭包,也可以使用委托。另一个选项是使用
NotificationCenter.post
NotificationCenter.addObserver