1. ホーム
  2. swift

[解決済み] Swiftでコアデータを日付(時間だけでなく)でソートする

2022-03-04 20:51:07

質問

Swiftでコアデータを使ったアプリを作っています。私は日付である期限属性を持つタスクエンティティを使用しています。私は、この期日に従ってタスクを並べ替える必要があります。

NSSortDescriptorを使用し、keyをdueにしてみました。

NSSortDescriptor.init(key: "due", ascending: false)

課題です。

日/月/年を考慮せず、時間だけでデータをソートしてしまいます。

これがフェッチリクエストで取得したデータです。

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)")
}

コアデータ属性の写真

解決方法は?

スウィフト3

var sdSortDate = NSSortDescriptor.init(key: "date", ascending: false)
fr.sortDescriptors = [sdSortDate]
let result4 = try! context.fetch(fr)

Swift 3でテストしてみましたが、うまくいきました

[<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";
})]