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

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

よくお返事ありがとうございました。 – Satyam

0

私はそれが設定されています一度怠け者として宣言されたプロパティを変更することができないと信じています。

独自のゲッターを持つプロパティを使用して同じものを作成することができます。カスタムゲッターは、作成されたプライベートプロパティを返します。 sortOptionの設定者にprivateプロパティをnilに設定して、強制的に再計算させます。

0

あなたは、あなたがnilにその値を設定することにより、再初期化するように強制することができます...暗黙的に開封されたオプションの

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

すべきinspirationsResultsの宣言を変更した場合。でのように、inspirationsResultsをnilに設定すると、次にアクセスするときに、初期化コードが再び実行されます。初期化コードがnilを返さない限り、暗黙的にアンラップされたオプションを使用することは安全です。

didSetオブザーバでは、sortOptionの場合、inspirationResultsをnilに設定できます。次にinspirationResultsを使用すると、新しいソートを含む新しいバージョンが作成されます。

+0

フェッチされた結果コントローラを再初期化する必要はありません。ソート記述子を変更するだけで済みます。 – vadian

+0

ソート記述子を変更しても効果がありません。フェッチされた結果コントローラは自動的に結果を更新しません。 –

+0

もちろん、ソート記述子を変更した後にフェッチを実行する必要があります。私は自分の答えを更新しました。 – vadian

関連する問題