【问题标题】:Changing computed property in swift快速更改计算属性
【发布时间】:2017-05-12 01:16:45
【问题描述】:

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

【问题讨论】:

    标签: ios swift nsfetchedresultscontroller computed-properties


    【解决方案1】:

    将计算排序描述符的代码放入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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果您将 inspirationsResults 的声明更改为隐式展开的可选项

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

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

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

        【讨论】:

        • 你不需要重新初始化获取结果控制器,你只需要改变排序描述符。
        • 更改排序描述符不会有任何用处。获取的结果控制器不会自动更新其结果。
        • 对。当然,您必须在更改排序描述符后执行提取。我更新了我的答案。
        猜你喜欢
        • 1970-01-01
        • 2016-11-09
        • 2017-07-29
        • 2020-08-08
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        相关资源
        最近更新 更多