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
。