Сортировка результатов 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 - изменить приведенный выше код, чтобы обеспечить правильную сортировку массива "результатов". 2 - Определите код, который впоследствии может быть применен к массиву результатов для повторной сортировки по любому полю.

Заранее спасибо!

1 ответ

Решение

Спасибо - перед строкой request.predicate потребовались следующие строки:

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

Я использовал вышеприведенный ответ Оливера Спенсера, потому что подход к сортировке включает ожидающие изменения, которых нет в "максимальном" подходе (см. Документацию Apple по 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 )
}
Другие вопросы по тегам