Сортировка результатов 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 )
}