Swift 按日期(不仅仅是时间)对核心数据进行排序
Swift sort core data by date (not just time)
我正在 Swift 使用核心数据构建应用程序。我正在使用具有日期属性的任务实体。我需要根据这个截止日期对任务进行排序。
我尝试使用带有到期键的 NSSortDescriptor
NSSortDescriptor.init(key: "due", ascending: false)
问题:
它仅按时间对我的数据进行排序 - 不考虑 day/month/year
这是我从获取请求中获得的数据:
Optional(2017-02-06 03:29:18 +0000)
Optional(2017-02-08 03:29:27 +0000)
Optional(2017-02-07 03:29:38 +0000)
Optional(2017-02-08 03:30:29 +0000)
如何按较早出现的排序? (考虑到整个 NSDate 而不仅仅是时间部分)
我希望它是:
Optional(2017-02-06 03:29:18 +0000)
Optional(2017-02-07 03:29:38 +0000)
Optional(2017-02-08 03:29:27 +0000)
Optional(2017-02-08 03:30:29 +0000)
完整代码
所有已完成的任务在列表中为 0,我正在调用:
helper(showComp: true, sortBy: NSSortDescriptor.init(key: "due", ascending: false))
辅助函数:
func helper(showComp: Bool, sortBy: NSSortDescriptor?){
let g = cur as! Group
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Task")
let sortDescriptor0 = NSSortDescriptor.init(key: "completed", ascending: true)
let sortDescriptor = NSSortDescriptor.init(key: "index", ascending: true)
if sortBy == nil {
fetchRequest.sortDescriptors = [sortDescriptor0, sortDescriptor]
}else{
fetchRequest.sortDescriptors = [sortDescriptor0, sortBy!]
}
if (cur as! Group).name != "All"{
var predicate = NSPredicate(format: "group = %@", argumentArray: [g])
if !showComp {
predicate = NSPredicate(format: "group = %@ && completed = %@", argumentArray: [g, 0])
}
fetchRequest.predicate = predicate
}
do {
groups = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
核心数据属性照片
Swift 3
var sdSortDate = NSSortDescriptor.init(key: "date", ascending: false)
fr.sortDescriptors = [sdSortDate]
let result4 = try! context.fetch(fr)
我在Swift3测试过,效果很好
[<NSManagedObject: 0x618000089060> (entity: CoreDate; id: 0x61800002c460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p3> ; data: {
date = "2017-02-09 21:35:19 +0000";
}), <NSManagedObject: 0x61800008b680> (entity: CoreDate; id: 0x60000002c140 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p1> ; data: {
date = "2017-02-06 04:41:59 +0000";
}), <NSManagedObject: 0x60800008c080> (entity: CoreDate; id: 0x60800002d460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p2> ; data: {
date = "2017-02-17 18:28:39 +0000";
})]
After sort
[<NSManagedObject: 0x61800008b680> (entity: CoreDate; id: 0x60000002c140 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p1> ; data: {
date = "2017-02-06 04:41:59 +0000";
}), <NSManagedObject: 0x618000089060> (entity: CoreDate; id: 0x61800002c460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p3> ; data: {
date = "2017-02-09 21:35:19 +0000";
}), <NSManagedObject: 0x60800008c080> (entity: CoreDate; id: 0x60800002d460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p2> ; data: {
date = "2017-02-17 18:28:39 +0000";
})]
我正在 Swift 使用核心数据构建应用程序。我正在使用具有日期属性的任务实体。我需要根据这个截止日期对任务进行排序。
我尝试使用带有到期键的 NSSortDescriptor
NSSortDescriptor.init(key: "due", ascending: false)
问题:
它仅按时间对我的数据进行排序 - 不考虑 day/month/year
这是我从获取请求中获得的数据:
Optional(2017-02-06 03:29:18 +0000)
Optional(2017-02-08 03:29:27 +0000)
Optional(2017-02-07 03:29:38 +0000)
Optional(2017-02-08 03:30:29 +0000)
如何按较早出现的排序? (考虑到整个 NSDate 而不仅仅是时间部分)
我希望它是:
Optional(2017-02-06 03:29:18 +0000)
Optional(2017-02-07 03:29:38 +0000)
Optional(2017-02-08 03:29:27 +0000)
Optional(2017-02-08 03:30:29 +0000)
完整代码 所有已完成的任务在列表中为 0,我正在调用:
helper(showComp: true, sortBy: NSSortDescriptor.init(key: "due", ascending: false))
辅助函数:
func helper(showComp: Bool, sortBy: NSSortDescriptor?){
let g = cur as! Group
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Task")
let sortDescriptor0 = NSSortDescriptor.init(key: "completed", ascending: true)
let sortDescriptor = NSSortDescriptor.init(key: "index", ascending: true)
if sortBy == nil {
fetchRequest.sortDescriptors = [sortDescriptor0, sortDescriptor]
}else{
fetchRequest.sortDescriptors = [sortDescriptor0, sortBy!]
}
if (cur as! Group).name != "All"{
var predicate = NSPredicate(format: "group = %@", argumentArray: [g])
if !showComp {
predicate = NSPredicate(format: "group = %@ && completed = %@", argumentArray: [g, 0])
}
fetchRequest.predicate = predicate
}
do {
groups = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
核心数据属性照片
Swift 3
var sdSortDate = NSSortDescriptor.init(key: "date", ascending: false)
fr.sortDescriptors = [sdSortDate]
let result4 = try! context.fetch(fr)
我在Swift3测试过,效果很好
[<NSManagedObject: 0x618000089060> (entity: CoreDate; id: 0x61800002c460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p3> ; data: {
date = "2017-02-09 21:35:19 +0000";
}), <NSManagedObject: 0x61800008b680> (entity: CoreDate; id: 0x60000002c140 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p1> ; data: {
date = "2017-02-06 04:41:59 +0000";
}), <NSManagedObject: 0x60800008c080> (entity: CoreDate; id: 0x60800002d460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p2> ; data: {
date = "2017-02-17 18:28:39 +0000";
})]
After sort
[<NSManagedObject: 0x61800008b680> (entity: CoreDate; id: 0x60000002c140 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p1> ; data: {
date = "2017-02-06 04:41:59 +0000";
}), <NSManagedObject: 0x618000089060> (entity: CoreDate; id: 0x61800002c460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p3> ; data: {
date = "2017-02-09 21:35:19 +0000";
}), <NSManagedObject: 0x60800008c080> (entity: CoreDate; id: 0x60800002d460 <x-coredata://E7D9FD6F-5DCF-464B-93BF-D1609BF35695/CoreDate/p2> ; data: {
date = "2017-02-17 18:28:39 +0000";
})]