Применить sortDescriptor к NSFetchRequest после группировки
Я строю выставочный зал, в котором более 45000 каталогов, каждый из которых представлен в виде Literature
в CoreData.
Оптимизировать поиск - вместо поиска Literature
Я добавил еще одну сущность - LiteratureSearchIndex
в CoreData, который имеет searchvalue
(либо заглавное слово / ключевое слово / тег и т. д., представляющее часть литературы), score
(чтобы оценить результаты) и literatureid
,
Когда пользователь вводит что-то в поиске или фильтрует - я делаю fetchRequest для LiteratureSearchIndex, группирую результаты и сортирую их по общему количеству баллов.
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "LiteratureSearchIndex")
let entityDescription = NSEntityDescription.entity(forEntityName: "LiteratureSearchIndex", in: moc)
let sumDescription = NSExpressionDescription()
sumDescription.name = "totalScore"
sumDescription.expression = NSExpression(forFunction: "sum:", arguments: [NSExpression(forKeyPath: "score")])
sumDescription.expressionResultType = .integer64AttributeType
if let literatureid = entityDescription?.attributesByName["literatureid"] {
request.propertiesToGroupBy = [literatureid]
request.propertiesToFetch = [literatureid, sumDescription]
request.havingPredicate = NSPredicate(format: "%@ >= %@", NSExpression(forVariable: "totalScore"), NSNumber(value: minScore))
}
request.predicate = ...
request.resultType = .dictionaryResultType
request.fetchBatchSize = 50
В настоящее время я сортирую результаты после moc.fetch() следующим образом:
results.sort(by: { (a: [String: Any], b: [String: Any]) -> Bool in
if let aTotalScore = a["totalScore"] as? Int, let bTotalScore = b["totalScore"] as? Int {
return aTotalScore > bTotalScore
} else {
return true
}
})
Есть ли лучший / более быстрый способ сортировки результатов (аналогично применению havingPredicate
над массивом словарей)?