core-data - 当用户更改全局对象时重新初始化合并发布者
问题描述
到目前为止,我有一个运行良好的 Core Data 发布者。我有一个Workspace
实体和一个Project
实体。我使用以下发布者来获取给定工作区的所有项目:
class ProjectModel: ObservableObject {
@Published var projects = [Project]()
private var cancellableSet: Set<AnyCancellable> = []
init(){
CoreDataPublisher(request: Project.getAllProjects(), context: PersistenceController.shared.container.viewContext)
.sink(
receiveCompletion: { print($0) },
receiveValue: { [weak self] items in
self?.projects = items
})
.store(in: &cancellableSet)
}
}
获取请求getAllProjects()
位于此处的核心数据实体扩展中,其中NSPredicate
过滤器基于Workspace
UI 中设置的对象。
//Core Data Entity Extension
extension Project{
@nonobjc public class func getAllProjects() -> NSFetchRequest<Project> {
let workspace = AppState.shared.workspace as Workspace //<-- The user can change this workspace
let request = NSFetchRequest<Project>(entityName: "\(Self.self)")
request.sortDescriptors = [NSSortDescriptor(keyPath: \Project.name, ascending: true)]
request.predicate = NSPredicate(format: "workspace = %@", workspace)
return request
}
}
这个Workspace
对象在一个全局状态类中:
class AppState: ObservableObject{
static let shared = AppState()
@Published var workspace: Workspace!
init(){
//Setup the workspace for the first time
}
}
我可以成功地从我的发布者那里接收数据,并且可以成功地更改Workspace
UI 中的全局。问题是在更改 之后Workspace
,发布者仍然指向Workspace
创建获取请求时最初设置的旧。
当's更改时,如何提示ProjectModel
重新初始化以更新发布者的状态?AppState
workspace
解决方案
通常,实现此目的的方法是使用flatMap
发布者上的运算符。flatMap
让您“根据收到的值创建一个新的发布者,然后将该发布者的输出用作整个发布者链的输出”。
它看起来像这样:
AppState.shared.$workspace.flatMap { workspace in
let request = NSFetchRequest<Project>(entityName: "\(Project.self)")
request.sortDescriptors = [NSSortDescriptor(keyPath: \Project.name, ascending: true)]
request.predicate = NSPredicate(format: "workspace = %@", workspace)
return CoreDataPublisher(request: request, context: PersistenceController.shared.container.viewContext)
}
这为您提供了一个新的发布者:
- 当您的应用程序状态的属性发生变化时,无论新值是什么
.workspace
,都会构造一个新的CoreDataPublisher
Workspace
- 将其
CoreDataPublisher
用作整个发布者流的值的来源
推荐阅读
- python - 如何扩展列表以处理诸如“38359*0”之类的元素,我想将其表示为等于 0 的 38359 个元素?
- websphere - 如何从 Websphere Portal 服务器获取 HTML url?
- pagespeed - Google PageSpeed Insights 上的灯塔错误 - ERRORED_DOCUMENT_REQUEST
- imagemagick - 将图像转换为不带 BMP 标头的 BMP RGB565
- graph - 如何在连通图中匹配 Gremlin 中未链接的顶点
- ios - 在 ios 上反应原生 57.7 黑屏
- python - 如何在 Kivy 的屏幕(类)之间传递变量?
- python - 在 Django 站点上运行外部 Python 脚本
- soap - NetSuite SOAP 更新到地址簿添加地址
- javascript - 是否可以在每次下载后增加的 PDF 上生成动态邮票序列号?