簡體   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