在 swift 中更改计算的 属性
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
排序的显式案例。
更改排序描述符后,您需要执行新的提取并重新加载 table 视图。
并在初始化结果控制器的方法中简单地写:
self.sortOption = .none
我认为声明为惰性的 属性 一旦设置就无法更改。
您可以使用带有自定义 getter 的 属性 自己创建相同的东西,returns 私有 属性 如果它为 nil 则创建。让 sortOption 的 setter 将私有 属性 设置为 nil 以强制重新计算它。
如果将 inspirationsResults
的声明更改为隐式展开的可选
fileprivate lazy var inspirationsResults: NSFetchedResultsController<Inspiration>! = { ...
...然后你可以通过将它的值设置为零来强制它重新初始化。例如,如果将 inspirationsResults
设置为 nil,则下次访问它时,初始化代码将再次运行。只要您的初始化代码从不 returns nil.
,在这里使用隐式展开的可选是安全的
然后您可以在 sortOption
的 didSet
观察器中将 inspirationResults
设置为 nil。下次您使用 inspirationResults
时,您将获得具有新排序的新版本。
我将 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
排序的显式案例。
更改排序描述符后,您需要执行新的提取并重新加载 table 视图。
并在初始化结果控制器的方法中简单地写:
self.sortOption = .none
我认为声明为惰性的 属性 一旦设置就无法更改。
您可以使用带有自定义 getter 的 属性 自己创建相同的东西,returns 私有 属性 如果它为 nil 则创建。让 sortOption 的 setter 将私有 属性 设置为 nil 以强制重新计算它。
如果将 inspirationsResults
的声明更改为隐式展开的可选
fileprivate lazy var inspirationsResults: NSFetchedResultsController<Inspiration>! = { ...
...然后你可以通过将它的值设置为零来强制它重新初始化。例如,如果将 inspirationsResults
设置为 nil,则下次访问它时,初始化代码将再次运行。只要您的初始化代码从不 returns nil.
然后您可以在 sortOption
的 didSet
观察器中将 inspirationResults
设置为 nil。下次您使用 inspirationResults
时,您将获得具有新排序的新版本。