2017-03-06 32 views
1

我有一个NSFetchedResultsController,它提供了一个UITableViewControllerAppointment实体,其中包含一个属性dateTime在NSSortDescriptor中排序(在今天之前或之后)

我的目标是有分类的这样的任命名单:前天明天

  • 后,昨天

    1. 今天
    2. 明天

    换句话说: 首先sor t在今天之前还是之后,然后是dateTime。所以首先排序(dateTime > %TODAY%),然后在dateTime本身(未来上升,过去下降)。

    有没有办法做到这一点?我的问题是,我不能在排序描述符中使用%TODAY%,但也许有另一种方法来实现相同的视觉效果。

    UPDATE:请注意接受的答案是不可能的,NSFetchedResultsController。我选择了另一个解决方案,在显示视图之前订购Appointments,将其保存到数据库,并让NSFetchedResultsController选取更改。

    UPDATE 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

    这是唯一的想法。可能是你可以创建sortdescriptor这样的:

    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 
    } 
    

    我认为这将是工作。

    +0

    您不能在fetchRequest中使用基于块的排序描述符。请参阅https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/PersistentStoreFeatures.html#//apple_ref/doc/uid/TP40001075-CH23-SW1 –

    +0

    像Jon说的那样,我无法使用但是这让我想到了另一种解决方案,在获取之前使用排序描述符进行排序。现在我有一个属性'订单',每次有人打开视图时都会设置。这从未超过10个左右的约会,所以我没有看到任何性能问题。谢谢 – Arjan

    +0

    @Sergey仅供参考您的答案并不完全符合我的要求(我的问题更清楚)。我做了我自己的实现,但如果你愿意,欢迎你更新你的答案。 – Arjan

    1

    使用两个fetchedResultsControllers,一个分类与排除今天之前创建的那些谓词上升,和一个分类与排除未来的约会谓词下降。

    编写一个函数来在fetchedResultsController indexPath和tableview的indexPath之间进行转换,反之亦然。只要确保跟踪你正在处理的是哪种indexPath,这并不难。

    +0

    嗨,乔恩,我实际上有一个基类'CoreDataTableViewController',我不想改变或复制一个屏幕,所以我去了另一种解决方案。谢谢你的想法。 – Arjan

    相关问题