在swift中更改计算属性

时间:2016-12-27 18:40:05

标签: ios swift nsfetchedresultscontroller computed-properties

我将NSFetchedResultsController作为惰性计算属性。 基于变量,创建排序描述符。这是我的代码:

private var sortOption: Options = .none
fileprivate lazy var inspirationsResults: NSFetchedResultsController<Inspiration> = {
    // Create Fetch Request
    let fetchRequest: NSFetchRequest<Inspiration> = Inspiration.fetchRequest()

    // Configure Fetch Request
    //let optn = self.sortOption.rawValue
    switch (self.sortOption) {
    case .sortAscending:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "inspirationName", ascending: true)]
    case .sortDescending:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "inspirationName", ascending: false)]
    case .sortByAdding:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
    case .sortByUpdated:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
    case .showFilter:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
    default:
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
    }
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
    fetchRequest.fetchBatchSize = 10
    // Create Fetched Results Controller
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: CoreDataManager.shared.getContext(), sectionNameKeyPath: nil, cacheName: nil)

    // Configure Fetched Results Controller
    fetchedResultsController.delegate = self

    return fetchedResultsController
}()

当sortOption变量的值改变时,我想重新计算“inspirationsResults”变量并相应地更改排序描述符。如何实现呢?

3 个答案:

答案 0 :(得分:2)

将代码计算到didSet属性sortOption观察者的计算排序描述符:

private var sortOption: Options = .none {
    didSet {
        let sortDescriptor : NSSortDescriptor
        switch sortOption {
            case .sortAscending:
                sortDescriptor = NSSortDescriptor(key: "inspirationName", ascending: true)
            case .sortDescending:
                sortDescriptor = NSSortDescriptor(key: "inspirationName", ascending: false)
            default:
                sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
         }
         fetchedResultsController.fetchRequest.sortDescriptors = [sortDescriptor]
         do {
            try fetchedResultsController.performFetch()
            tableView.reloadData()
         } catch {
            print(error)
         }
    }
}

default案例涵盖了按timeStamp - false排序的所有明确案例 更改排序描述符后,您需要执行新的提取并重新加载表视图。

在初始化结果控制器的方法中,只需写:

self.sortOption = .none

答案 1 :(得分:0)

我相信声明为懒惰的属性一旦设置就无法更改。

你可以使用带有自定义getter的属性自己创建相同的东西,该属性返回一个私有属性,如果它是零,则创建它。让sortOption的setter将private属性设置为nil以强制重新计算。

答案 2 :(得分:0)

如果您将inspirationsResults的声明更改为隐式解包的可选

fileprivate lazy var inspirationsResults: NSFetchedResultsController<Inspiration>! = { ...

...然后你可以通过将其值设置为nil来强制重新初始化。如同,如果将inspirationsResults设置为nil,则下次访问时,初始化代码将再次运行。只要您的初始化代码永远不会返回nil,使用隐式展开的可选项就是安全的。

然后,您可以在inspirationResults didSet观察者中将sortOption设置为nil。下次使用inspirationResults时,您将获得新版本的新版本。