我想创建一些解决方案,允许使用新@propertyWrapper
机制按照特定标准观察记录数。我想找到优雅的方法来解决它。
- 我的解决方案有什么可以改进的?
- 如何使用
@Environment(\.managedObjectContext) var viewContext
而不是共享实例?
如果我使用 Environment 的实例,我会遇到这样的错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+entityForName:nil 不是用于搜索实体名称“Todo”的合法 NSPersistentStoreCoordinator”
我的解决方案:
@propertyWrapper class FetchCountRequest<Entity> where Entity: NSFetchRequestResult {
private var bag = Set<AnyCancellable>()
var wrappedValue: Int = .zero
init(request: NSFetchRequest<Entity>) {
do {
wrappedValue = try PersistenceController.shared.mainContext.count(for: request)
NotificationCenter.default
.publisher(for: NSManagedObjectContext.willSaveObjectsNotification, object: PersistenceController.shared.mainContext)
.compactMap { _ -> Int? in
try? PersistenceController.shared.mainContext.count(for: request)
}
.sink { [weak self] value in
self?.wrappedValue = value
}
.store(in: &bag)
} catch {
print(error)
}
}
}
用法:
struct MyView: View {
@FetchCountRequest(request: Todo.fetchRequest())
var todoCount: Int
var body: some View {
Text("\(todoCount)")
}
}