0

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」変数を再計算し、それに応じてソート記述子を変更したいと考えています。それを達成する方法は?

4

3 に答える 3

3

ソート記述子を計算するコードをプロパティの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
于 2016-12-27T19:06:14.390 に答える
0

遅延として宣言されたプロパティは、一度設定すると変更できないと思います。

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

于 2016-12-27T19:31:34.817 に答える