假设我有两个实体,员工和部门.部门与员工有多对多的关系,许多员工可以在每个部门,但每个员工只属于一个部门.我希望在tableview中显示所有员工,这些员工使用NSFetchedResultsController按照属于他们所属部门的属性的数据进行排序.问题是,当部门对象收到更改时,我希望我的表更新,就像员工的常规属性更改一样,但FetchedResultsController似乎不跟踪相关对象.我通过以下方式部分通过了这个问题:
for (Employee* employee in department.employees) {
[employee willChangeValueForKey:@"dept"];
}
/* Make Changes to department object */
for (Employee* employee in department.employees) {
[employee didChangeValueForKey:@"dept"];
}
Run Code Online (Sandbox Code Playgroud)
这显然不是理想的,但它确实导致基于员工的FRC委托方法didChangeObject被调用.我现在留下的真正问题是在跟踪员工对象的FRC的排序中:
NSEntityDescription *employee = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"department.someProperty" ascending:NO];
Run Code Online (Sandbox Code Playgroud)
这很好,并且在第一次调用时对员工进行了正确的排序,问题是当我对某个部门进行更改时,someProperty应该更改我的员工表的排序没有任何反应.有没有什么好方法让我的员工FRC跟踪关系中的变化?特别是我只需要一些方法让它在排序基于相关属性时更新排序.我查看了一些类似的问题,但未能找到满意的解决方案.
我有一个带有 Core Data 的 SwiftUI 项目。数据模型是一个简单的一对多和两个主要视图,每个视图的顶部都有一个文本字段和一个用于将新项目添加到下面的列表视图的按钮。第一种观点适用于关系的一方,第二种观点适用于多方。因此,第一个中的 NavigationLink 打开第二个并传递 One 对象。看起来相当标准的东西。创建 One 的方法有效,并且当托管对象上下文保存新项目时,下面的列表会立即更新。但是,在设备上查看时,相同类型的方法不会刷新多方的列表,尽管它在模拟器和预览窗口中运行良好。数据肯定会被保存,因为如果您导航回“一侧”然后重新选择它以重新加载“许多”视图,它会在列表中显示新项目。
我浏览了很多教程、其他问题等,但没有找到原因。我在访问关系的多方方面是否做错了什么,或者我还需要做些什么才能仅刷新多方的视图?谢谢!!!
完整项目可在https://github.com/fahrsoft/OneToManyTest获取
从 ContentView 中,显示一侧(注意:OneView 是一个简单的视图,它获取对象并显示文本。ManyView 也是如此。):
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: One.entity(), sortDescriptors: []) var ones: FetchedResults<One>
@State private var newName = ""
@State var isNavTitleHidden = true
var body: some View {
NavigationView {
VStack {
HStack {
TextField("New One", text: self.$newName)
Spacer()
Button(action: {
let newOne = One(context: self.moc)
newOne.name = self.newName
self.newName = ""
try? self.moc.save()
}) {
Image(systemName: "plus.circle.fill") …
Run Code Online (Sandbox Code Playgroud)