筛选 NSFetchedResultsController 结果 swift 2

filter NSFetchedResultsController result swift 2

我想要在 tableview 上自动更新..为此我使用了 NSFetchedResultsControlleras

lazy var fetchedResultsController: NSFetchedResultsController = {
    // Initialize Fetch Request
    let fetchRequest = NSFetchRequest(entityName: "Student")

    // Add Sort Descriptors
    let sortDescriptor = NSSortDescriptor(key: "grade", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor]

    // Initialize Fetched Results Controller
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

    // Configure Fetched Results Controller
    fetchedResultsController.delegate = self

    return fetchedResultsController
}()

但是我必须在加载后过滤结果作为用户选择..

  @IBAction func onSegmentValueChanged(sender: UISegmentedControl)
    {
        if sender.selectedSegmentIndex == 0{

            //filter by grade
            let fetchRequest = NSFetchRequest(entityName: "Student")
            let sortDescriptor = NSSortDescriptor(key: "grade", ascending: true)
            fetchRequest.sortDescriptors = [sortDescriptor]
            let filterfetchResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
            let predicate = NSPredicate(format: "address = %@","Russia")
            filterfetchResultsController.fetchRequest.predicate = predicate
            self.tableView.reloadData()

        }else{

            let fetchRequest = NSFetchRequest(entityName: "Student")
            let sortDescriptor = NSSortDescriptor(key: "grade", ascending: true)
            fetchRequest.sortDescriptors = [sortDescriptor]
            let filterfetchResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
            let predicate = NSPredicate(format: "grade = %d",10)
            filterfetchResultsController.fetchRequest.predicate = predicate
            self.tableView.reloadData()


        }

    }

然而重新加载 tableView 但数据不是 filtered.how 我可以解决这个问题吗?This 是我正在工作的演示项目 on.Or 我应该使用正常的方式传递结果并按照正常方法重新加载 tableView 来解决此问题?

  1. 您必须使用 self.fetchedResultsController,这是您的数据源,而不是 filterfetchResultsController:没有连接。
  2. 您必须执行 performFetch() 来执行更改的谓词

这对我有用:

@IBAction func onSegmentValueChanged(sender: UISegmentedControl)
{
    if sender.selectedSegmentIndex == 1{

        //filter by address
        let predicate = NSPredicate(format: "address == %@","Russia")
        self.fetchedResultsController.fetchRequest.predicate = predicate

    }else{

        let predicate = NSPredicate(format: "grade = %d",10)
        self.fetchedResultsController.fetchRequest.predicate = predicate

    }

    do {
        try self.fetchedResultsController.performFetch()
    } catch {
        let fetchError = error as NSError
        print("\(fetchError), \(fetchError.userInfo)")
    }
    self.tableView.reloadData()

}