0

我將NSFetchedResultsController作爲延遲計算屬性。 基於一個變量,創建排序描述符。這裏是我的代碼:在swift中更改計算屬性

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」變量,並相應地更改排序描述符。如何實現它?

回答

2

把代碼來計算排序描述成didSet觀察員sortOption屬性:

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 
+0

非常感謝您的回覆,並給出了很好的解釋。 – Satyam

0

我相信財產申報一旦它設置爲懶惰不能改變。

您可以使用具有自定義getter的屬性自己創建相同的東西,該屬性返回創建的私有屬性,如果它爲零。讓sortOption的setter將私有屬性設置爲nil,強制重新計算它。

0

如果更改的inspirationsResults聲明是一個隱含展開可選

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

...那麼你可以強制它通過它的值設置爲無重新初始化。與之相似,如果您將inspirationsResults設置爲零,則下次訪問它時,初始化代碼將再次運行。只要您的初始化代碼永遠不會返回nil,那麼使用隱式解包的可選方法在此處是安全的。

然後,您可以將inspirationResults設置爲didSet觀察者爲零sortOption。下次您使用inspirationResults時,您將獲得新排序的新版本。

+0

您不需要重新初始化獲取的結果控制器,只需更改排序描述符即可。 – vadian

+0

更改排序描述符將無效。獲取的結果控制器不會自動更新其結果。 –

+0

對。當然,您必須在更改排序描述符後執行提取。我更新了我的答案。 – vadian