ios - 自定义 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"
}
解决方案
解决方案是计算属性
@objc var startOfDay : Date {
return Calendar.current.startOfDay(for: theDate)
}
并将其用作排序条件。
推荐阅读
- android - 杀死android pie中的应用程序后Scanfilter不扫描?
- android - 无法通过意图将数组列表从一个活动传递到另一个活动
- c# - 启动期间 Xamarin.UWP 未处理的异常
- sql - 这意味着在 select 子句中搜索的字段之前有一个零?
- batch-file - 根据文件夹中存在的文件移动文件
- authentication - 钥匙斗篷 | 如何添加自定义 keycloak 密码策略?
- typo3 - 如何使用语言的多树概念设置 TYPO3 9.5.x
- angular - 离子 if else 语句显示 div
- rest - REST API:如果文档会根据查询参数而改变,则 GET 请求会返回错误?
- typescript - Azure Functions - 等待 context.log