2016-03-14 3 views
0

Я хочу обновить NSFetchedResultController с другим предикатом, если пользователь нажмет на лист действий.Обновить NSFetchedResultController в Swift

Вот код:

lazy var fetchResultController: NSFetchedResultsController = { 

    let fetchRequest = NSFetchRequest(entityName: "Debt") 
    let filterText:String? 
    let ascending:Bool? 

    if NSUserDefaults.standardUserDefaults().objectForKey("filterType")?.stringValue == "name" { 
     filterText = "name" 
     ascending = true 
    } 
    else 
    { 
     filterText = "date" 
     ascending = true 
    } 

    let sortDescriptor = NSSortDescriptor(key: filterText, ascending: ascending!) 
    fetchRequest.sortDescriptors = [sortDescriptor] 

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: CoreDataManager.sharedManager.managedObjectContext, sectionNameKeyPath: filterText, cacheName: nil) 
    fetchedResultsController.delegate = self 

    return fetchedResultsController 
}() 

@IBAction func didTouchUpInsideFilterButton(sender: UIBarButtonItem) { 

    let alertController = UIAlertController(title: "Filter By:", message: "", preferredStyle: .ActionSheet) 

    let nameAction = UIAlertAction(title: "Name", style: .Default) { (UIAlertAction) -> Void in 
     NSUserDefaults.standardUserDefaults().setObject("name", forKey: "filterType") 

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

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (UIAlertAction) -> Void in 

     self.dismissViewControllerAnimated(true, completion: nil) 
    }; 

    alertController.addAction(nameAction) 

    alertController.addAction(cancelAction) 

    self.presentViewController(alertController, animated: true, completion: nil) 
} 

В блоке завершения alertAction после вызова попробовать self.fetchResultController.performFetch() метод fetchResultController не вызывается снова, чтобы обновить предикат.

Решение проблемы.

ответ

1

Часть кода, следующего за объявлением fetchResultController, предназначена для инициализации свойств и будет выполняться только один раз при первом использовании свойства. Это означает, что этот кусок кода, который задает предикат и т. Д., Не будет выполняться при вызове didTouchUpInsideFilterButton (если эта ссылка на self.fetchResultController не будет использоваться при первом запуске fetchResultController, что кажется маловероятным).

Вам нужно явно изменить fetchResultController за пределы инициализатора, если вы хотите его обновить.