Ada*_* S. 18 core-data objective-c nsfetchedresultscontroller
假设我有两个实体,员工和部门.部门与员工有多对多的关系,许多员工可以在每个部门,但每个员工只属于一个部门.我希望在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跟踪关系中的变化?特别是我只需要一些方法让它在排序基于相关属性时更新排序.我查看了一些类似的问题,但未能找到满意的解决方案.
Mar*_*rra 19
在NSFetchedResultsController实际上仅仅是设计为一次观看一个实体.您的设置虽然有意义,但它有点超出了NSFetchedResultsController目前自己能够观看的范围.
我的建议是建立自己的观察者.您可以将它基于我在GitHub上设置的ZSContextWatcher,或者您可以使它更简单.
基本上你想要监视NSManagedObjectContextDidSaveNotification帖子,然后在一个包含你的部门实体的火灾时重新加载你的表.
我还建议向Apple 提交一份报告并要求NSFetchedResultsController对其进行改进.
迅速
因为 NSFetchedResultsController 一次是为一个实体设计的,所以您必须监听 NSManagedObjectContextObjectsDidChangeNotification 以便收到有关所有实体关系更改的通知。
下面是一个例子:
//UITableViewController
//...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(managedObjectsDidChangeHandler(notification:)), name: .NSManagedObjectContextObjectsDidChange, object: mainManagedContext)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self, name: .NSManagedObjectContextObjectsDidChange, object: mainManagedContext)
}
@objc fileprivate func managedObjectsDidChangeHandler(notification: NSNotification) {
tableView.reloadData()
}
//...
Run Code Online (Sandbox Code Playgroud)