2017-03-06 14 views
1

私はUITableViewControllerAppointmentの属性を持つエンティティdateTimeを提供するNSFetchedResultsControllerを持っています。昨日 NSSortDescriptorで並べ替える(今日または前)NSSortDescriptorで並べ替え

  1. 今日
  2. 明日
  3. 日は明日
  4. 後の昨日
  5. 日:

    私の目標は次のようにソートされた予定のリストを持つことですつまり、 最初のsorそれが今日の前後かどうかについては、dateTimeです。だから(dateTime > %TODAY%)で最初にソートし、次にdateTime(将来の昇順、降順で降順)でソートします。

    これを行う方法はありますか?私の問題は、ソート記述子で%TODAY%を使用することはできませんが、同じ視覚的結果を得るための別の方法があるかもしれません。

    更新NSFetchedResultsControllerで受け入れられた回答はできません。私は、ビューを表示する前にAppointmentsを注文し、それをデータベースに保存して、NSFetchedResultsControllerに変更を反映させる別の解決方法を選択しました。

    更新2: 受け入れられた答えは、私が欲しかったものを正確にしました。私の実装:

    let futureAppointments = appointments.filter({ $0.dateTime != nil && $0.dateTime?.compare(Date()) == .orderedDescending }) 
        .sorted(by: { $0.dateTime?.compare($1.dateTime! as Date) == .orderedAscending }) 
    
    let pastAppointments = appointments.filter({ $0.dateTime != nil && $0.dateTime?.compare(Date()) == .orderedAscending }) 
        .sorted(by: { $0.dateTime?.compare($1.dateTime! as Date) == .orderedDescending }) 
    
    let sorted = futureAppointments + pastAppointments 
    
    for (index, appointment) in sorted.enumerated() { 
        appointment.order = NSNumber(integerLiteral: index) 
    } 
    

答えて

0

それは唯一のアイデアです。私はそれが仕事になると思う

NSSortDescriptor(key: "test", ascending: true) { (v1, v2) -> ComparisonResult in 
     guard let d1 = v1 as? Date else 
     { 
      return .orderedAscending 
     } 
     guard let d2 = v2 as? Date else 
     { 
     return .orderedAscending 
     } 
     if abs(d1.timeIntervalSinceNow) < abs(d2.timeIntervalSinceNow) { return .orderedAscending } 
     if abs(d1.timeIntervalSinceNow) > abs(d2.timeIntervalSinceNow) { return .orderedDescending } 
     return .orderedSame 
} 

:あなたはこのようなsortdescriptorを作成することができかもしれません。

+0

fetchRequestでブロックベースのソート記述子を使用することはできません。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/PersistentStoreFeatures.html#//apple_ref/doc/uid/TP40001075-CH23-SW1 –

+0

ジョンさんのように、私は使用できませんしかし、それは私に別の解決策を考えさせ、フェッチの前にあなたのソート記述子で注文しました。今私は誰かがビューを開くたびに設定されるプロパティ 'order'を持っています。それは決して10以上の予定ではないので、私はパフォーマンスの問題を見ません。ありがとうございました – Arjan

+0

@ Sergey FYIあなたの答えは私が望んでいたものとまったく同じではありませんでした。自分で実装しましたが、必要に応じて、あなたの答えを更新することができます。 – Arjan

1

2つの使用fetchedResultsControllers、一つは、今日の前に作成されたものを除く述語で昇順にソートし、一つは、将来の予定を除く述語で降順にソート。

fetchedResultsController indexPathとtableviewのindexPathを変換する関数を記述します。逆も同様です。あなたが扱っているindexPathの種類を把握しておくと、それほど難しくありません。

+0

こんにちはジョン、私は実際には、私は変更または1つの画面のコピーしたくない基本クラス 'CoreDataTableViewController'を持っているので、私は別の解決策を行った。一緒に考えてくれてありがとう。 – Arjan

関連する問題