Ios 获取的结果控制器在controllerDidChangeContent之后复制结果
我有两张桌子:一张是所有员工的名单,另一张是能够提供某种服务(即按摩)的员工名单 数据模型如下所示: 每项服务都可以有许多员工提供,每个员工都可以提供许多服务(多对多关系)。 问题是,每次我将员工从Ios 获取的结果控制器在controllerDidChangeContent之后复制结果,ios,swift,core-data,nsfetchedresultscontroller,Ios,Swift,Core Data,Nsfetchedresultscontroller,我有两张桌子:一张是所有员工的名单,另一张是能够提供某种服务(即按摩)的员工名单 数据模型如下所示: 每项服务都可以有许多员工提供,每个员工都可以提供许多服务(多对多关系)。 问题是,每次我将员工从员工列表拖放到提供此服务的员工时,当我从最后一个索引开始时,会得到重复的结果,而当我从第一个索引开始时,一切正常 当我再次加载viewController时(即使没有再次启动应用程序),所有数据都会正确显示。 此处代码: 在EmployeesAvailableTableViewController
员工列表
拖放到提供此服务的员工
时,当我从最后一个索引开始时,会得到重复的结果,而当我从第一个索引开始时,一切正常
当我再次加载viewController时(即使没有再次启动应用程序),所有数据都会正确显示。
此处代码:在
EmployeesAvailableTableViewController.swift中
I初始化NSFetchedResultsController
func initializeFetchedResultsController() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
let request: NSFetchRequest<Employee>
request = NSFetchRequest(entityName: "Employee")
//this predicate show only those employee who don't have the entity `service` yet.
request.predicate = NSPredicate(format: "SUBQUERY(service, $c, $c.service_id == %@).@count == 0", (service?.service_id!)!)
let lastNameSort = NSSortDescriptor(key: "lastName", ascending: true)
request.sortDescriptors = [lastNameSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
do {
//I added this as suggested in another question on stackoverflow but nothing has changed
if (self.fetchedResultsController?.fetchedObjects == nil){
try fetchedResultsController?.performFetch()
}
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
}
func initializeFetchedResultsController() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
context.stalenessInterval = 0
let request: NSFetchRequest<Employee>
request = NSFetchRequest(entityName: "Employee")
request.predicate = NSPredicate(format: "ANY service.service_id == %@", (service?.service_id)!)
let lastNameSort = NSSortDescriptor(key: "lastName", ascending: true)
request.sortDescriptors = [lastNameSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
do {
if (self.fetchedResultsController?.fetchedObjects == nil)
{
try fetchedResultsController?.performFetch()
}
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
}
//both this delegates methods get called
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.assignedEmployeeTableView.reloadData()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.assignedEmployeeTableView.reloadData()
}
最后,在PriceListViewController
func initializeFetchedResultsController() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
let request: NSFetchRequest<Employee>
request = NSFetchRequest(entityName: "Employee")
//this predicate show only those employee who don't have the entity `service` yet.
request.predicate = NSPredicate(format: "SUBQUERY(service, $c, $c.service_id == %@).@count == 0", (service?.service_id!)!)
let lastNameSort = NSSortDescriptor(key: "lastName", ascending: true)
request.sortDescriptors = [lastNameSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
do {
//I added this as suggested in another question on stackoverflow but nothing has changed
if (self.fetchedResultsController?.fetchedObjects == nil){
try fetchedResultsController?.performFetch()
}
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
}
func initializeFetchedResultsController() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
context.stalenessInterval = 0
let request: NSFetchRequest<Employee>
request = NSFetchRequest(entityName: "Employee")
request.predicate = NSPredicate(format: "ANY service.service_id == %@", (service?.service_id)!)
let lastNameSort = NSSortDescriptor(key: "lastName", ascending: true)
request.sortDescriptors = [lastNameSort]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController?.delegate = self
do {
if (self.fetchedResultsController?.fetchedObjects == nil)
{
try fetchedResultsController?.performFetch()
}
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
}
//both this delegates methods get called
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.assignedEmployeeTableView.reloadData()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.assignedEmployeeTableView.reloadData()
}
func initializeFetchedResultsController(){
让appDelegate=UIApplication.shared.delegate为!appDelegate
让上下文=appDelegate.managedObjectContext
context.stalenessInterval=0
let请求:NSFetchRequest
request=NSFetchRequest(entityName:“雇员”)
request.predicate=NSPredicate(格式:“ANY service.service\u id==%@”,(service?.service\u id)!)
让lastNameSort=NSSortDescriptor(键:“lastName”,升序:true)
request.sortDescriptors=[lastNameSort]
fetchedResultsController=NSFetchedResultsController(fetchRequest:request,managedObjectContext:context,sectionNameKeyPath:nil,cacheName:nil)
fetchedResultsController?.delegate=self
做{
if(self.fetchedResultsController?.fetchedObject==nil)
{
请尝试获取ResultsController?.performFetch()
}
}抓住{
fatalError(“未能初始化FetchedResultsController:\(错误)”)
}
}
//这两个委托方法都会被调用
func controllerWillChangeContent(\ucontroller:NSFetchedResultsController){
self.assignedEmployeeTableView.reloadData()
}
func controllerDidChangeContent(\控制器:NSFetchedResultsController){
self.assignedEmployeeTableView.reloadData()
}