繁体   English   中英

快速更改计算属性

[英]Changing computed property in swift

我将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”变量并相应地更改排序描述符。 如何实现呢?

将用于计算排序描述符的代码放入sortOption属性的didSet观察器中:

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

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

您可以使用带有自定义getter的属性来自己创建相同的事物,该属性将返回创建为null的私有属性。 让sortOption的setter将private属性设置为nil,以强制重新计算该属性。

如果更改的声明inspirationsResults是一个隐含展开可选

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

...然后您可以通过将其值设置为nil来强制其重新初始化。 如,如果你设置inspirationsResults为零,那么下次访问它时,初始化代码再次运行。 只要您的初始化代码从不返回nil,在这里使用隐式解包的可选是安全的。

然后,您可以设置inspirationResults为零的didSet观察员sortOption 下次使用inspirationResults您将获得具有新排序的新版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM