快速更改计算属性
Posted
技术标签:
【中文标题】快速更改计算属性【英文标题】: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”变量并相应地更改排序描述符。如何实现?
【问题讨论】:
【参考方案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,在此处使用隐式展开的可选项是安全的。
然后您可以在sortOption
的didSet
观察者中将inspirationResults
设置为nil。下次您使用inspirationResults
时,您将获得具有新排序的新版本。
【讨论】:
你不需要重新初始化获取结果控制器,你只需要改变排序描述符。 更改排序描述符不会有任何用处。获取的结果控制器不会自动更新其结果。 对。当然,您必须在更改排序描述符后执行提取。我更新了我的答案。以上是关于快速更改计算属性的主要内容,如果未能解决你的问题,请参考以下文章