Сортировка результатов CoreData с использованием NSPredicate в Swift

В настоящее время я пишу простое приложение для телефонной книги в Swift и вам нужно сортировать результаты из запроса CoreData.

В принципе, я создал объект NSManagedObject под названием "Directory" с соответствующими именами полей, например. "name_f" - это имя пользователя.

Имена в базе данных CoreData, которые запрашиваются, находятся в алфавитном порядке. Однако, хотя первый поиск возвращает результаты в алфавитном порядке, дальнейшие поисковые запросы иногда возникают после того, как база данных была запрошена другими областями программы. Я не уверен, почему это так, но хочу добавить код для активного сортировки возвращаемого массива в любом поле.

Мой код, который возвращает массив NSManagedObject, выглядит следующим образом:

func SearchName(nameToSearch: String) -> NSArray {
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext! //I added the !

    let request = NSFetchRequest(entityName: "Directory")
    request.returnsObjectsAsFaults = false      //will return the instance of the object

    //request.predicate = NSPredicate(format: "name_f = %@", nameToSearch)
    //request.predicate = NSPredicate(format: "name_f MATCHES '.*(\(nameToSearch)).*'")
    request.predicate = NSPredicate(format: "name_f MATCHES[cd] '(\(nameToSearch)).*'")
    var results:NSArray = context.executeFetchRequest(request, error: nil)
    return results
}

В стороне, я использую следующий код, чтобы вытащить определенное значение из возвращаемых результатов (где searchResult является экземпляром класса, в котором находится SearchName):

    var particularEntry = self.searchResult[self.selectedItem] as Directory
    lblDetailName.text = thisPerson.name_f

В идеале я хотел бы иметь возможность: 1 - Измените код выше, чтобы убедиться, что массив "results" отсортирован соответствующим образом. 2 - Определите код, который впоследствии может быть применен к массиву результатов для повторной сортировки по любому полю.

Спасибо заранее!

Ответ 1

Спасибо - Следующие строки были необходимы до строки request.predicate:

let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors

Ответ 2

Я использовал приведенный выше ответ от Оливера Спенсера, потому что подход к сортировке включает ожидающие изменения, которые не подходят для "максимального" подхода (см. яблочную документацию по NSFetchRequest).

Вот мой код для удобства:

func fetch_biggestImageID() -> Int {

    print("Fetching biggest ImageID")
    let request: NSFetchRequest<CD_Image> = CD_Image.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
    request.fetchLimit = 1

    var maxValue: Int64? = nil
    do {
        let result = try self.managedObjectContext.fetch(request)
        maxValue = result.first?.id
    } catch {
        fatalError("Unresolved error while retrieving max imageID value \(error)")
    }

    return  Int(truncatingIfNeeded:  maxValue ?? 0 )
}