Сортировать по дате - Swift 3

У меня есть func getData(), который извлекает основной объект данных, и я хочу сортировать их по дате. Как я могу применить NSPredicate или Predicate для получения данных из CoreData, отсортированных по дате?

Мой основной объект данных: Объект: Расходы Атрибуты: - количество - категория - дата

func getData() {
    let context = appDelegate.persistentContainer.viewContext

    do {
        expenses = try context.fetch(Expenses.fetchRequest())
    } catch {
        print("Cannot fetch Expenses")
    }
}

Спасибо за помощь!

Ответ 1

Предикаты предназначены для фильтрации результатов поиска. Для их сортировки вам необходимо использовать NSSortDescriptor. Предполагая, что у вас есть атрибут для объекта "Расходы", называемого датой типа "Дата":

func getData() {
    let context = appDelegate.persistentContainer.viewContext  

    let fetchRequest = NSFetchRequest<Expenses>(entityName: "Expenses")
    let sort = NSSortDescriptor(key: #keyPath(Expenses.date), ascending: true)
    fetchRequest.sortDescriptors = [sort]
    do {
       expenses = try context.fetch(fetchRequest)
    } catch {
        print("Cannot fetch Expenses")
    }
}

EDIT: я должен был упомянуть, что селектор сортировки добавляется в массив, чтобы при необходимости можно было добавить несколько дескрипторов сортировки. например сортировать по дате, затем по количеству ножек, затем по объему и т.д.

Ответ 2

Вам нужен дескриптор сортировки, чтобы получить все объекты в определенном порядке.

let sectionSortDescriptor = NSSortDescriptor(key: "date", ascending: true)
let sortDescriptors = [sectionSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors

Ответ 3

Моя функция для выполнения fetchRequest данных в Core Data и сортировки результатов по дате "timestamp" в порядке убывания. "Ruta" - это имя объекта.

//Array of Ruta entity
    rutas = [Ruta]()

    func getData() {

        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Ruta")
        let sort = NSSortDescriptor(key: "timestamp", ascending: false)
        request.sortDescriptors = [sort]

        do {
            rutas = try context.fetch(request) as! [Ruta]
        } catch {
            print("Fetching Failed")
        }
    }

Ответ 4

Чтобы получить данные, которые были добавлены в последний раз, необходимо установить ключ дескриптора сортировки как ObjectId.

let sectionSortDescriptor = NSSortDescriptor(key: #keyPath(Entity.ObjectId)
ascending: false) fetchRequest.sortDescriptors = [sectionSortDescriptor]

Ответ 5

В Swift 4 или Swift 5 вы можете использовать как

 func sortlist(){

    //1
    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext =
        appDelegate.persistentContainer.viewContext

    //2
    let fetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "User")
    let sort = NSSortDescriptor(key: "date", ascending: false)
    fetchRequest.sortDescriptors = [sort]

    //3
    do {
        let  langugeCodes = try managedContext.fetch(fetchRequest)
        for result in langugeCodes as [NSManagedObject] {
            var   username:String = result.value(forKey: "username")! as! String

            print("username==>",username)


        }


    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}