фильтр NSFetchedResultsController result swift 2

66
4

Я хочу автоматические обновления в tableview. Для этого я использовал NSFetchedResultsController как

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, но данные не фильтруются. Как я могу решить эту проблему? Это демонстрационный проект, над которым я работаю. Или я должен использовать обычный способ передачи результатов и перезагрузки tableView как обычный способ решить эту проблему?

спросил(а) 2020-03-28T22:18:45+03:00 3 месяца, 2 недели назад
1
Решение
100

Вы должны использовать self.fetchedResultsController, это ваш источник данных, а не filterfetchResultsController: нет соединения. Вы должны выполнить 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()

}

ответил(а) 2020-03-28T22:37:48.067632+03:00 3 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема