首页 > 解决方案 > 自定义 NSSortDescriptor 按日期对日期进行排序,同时忽略时间

问题描述

我正在实现一个简单的 CoreData 支持的表视图,它加载我想要按日期排序的对象。使用简单的降序日期 NSSortDescriptor 会导致单元格按日期和时间进行排序和分组。我想要的是按日期对单元格进行排序和分组,但忽略时间

我有一个存储两个日期属性的解决方法,一个同时具有时间和日期,另一个只有日期。但我不想维护两个独立的属性。即我想要按日期排序,同时忽略时间值,同时只存储一个日期属性。

我可以编写任何自定义 NSSortDescriptor 来实现此行为吗?

这是我的带有属性的 NSManagedObject 扩展:

extension AuthenticationKey {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<AuthenticationKey> {
        return NSFetchRequest<AuthenticationKey>(entityName: "AuthenticationKey")
    }

    @NSManaged public var createdDate: Date
    @NSManaged public var id: UUID
    @NSManaged public var isFavourite: Bool
    @NSManaged public var key: String
    @NSManaged public var name: String
    @NSManaged public var createdTime: Date

}

这是我的 NSFetchedResultsController:

let fetchedResultsController: NSFetchedResultsController<AuthenticationKey> = {
    let request = AuthenticationKey.fetchRequest
    request.sortDescriptors = [
        NSSortDescriptor(
            keyPath: \AuthenticationKey.createdDate,
            ascending: false
        )
    ]
    return NSFetchedResultsController(
        fetchRequest: request,
        managedObjectContext: CoreDataManager.shared.managedObjectContext,
        sectionNameKeyPath: "createdDate",
        cacheName: nil
    )
} ()

目前,createdDate仅存储日期,而createdTime存储时间和日期。我希望能够只有一个日期属性,即createdDate同时具有日期和时间,但排序描述符将仅按日期排序并忽略时间。

这是一个示例AuthenticationKey对象:

{
    "id": "6C9570F1-7539-44AC-9ED8-95ADB2CEC846",
    "createdDate": "2019-11-23 00:00:00 +0000",
    "isFavourite": false,
    "key": "oB+peCQ88rSE6dVs14x2X+T0QNwSY4CMrM1fu8WR",
    "name": "Key 298",
    "createdTime": "2019-11-23 12:20:18 +0000"
}

标签: iosswiftcore-data

解决方案


解决方案是计算属性

@objc var startOfDay : Date {
    return Calendar.current.startOfDay(for: theDate)
}

并将其用作排序条件。


推荐阅读