Я хотел бы поделиться тем, что я в итоге использовал, на случай, если кто-нибудь зайдет на эту страницу в поисках ответа на аналогичный вопрос.Мое первоначальное намерение состояло в том, чтобы использовать метод извлечения Core Data / SQL или какой-то особый предикат для достижения этой цели, но я думаю, что их нет.Поэтому я реализовал следующее:
class CoreData_User:NSManagedObject{
static func getMostFrequentCompany(context: NSManagedObjectContext ) -> String?{
// We get a list of distinc Company entries
guard let companies:[String] = CoreData_User.getDistinctCompanies(context: context) else { return nil }
var maxRepeatedCompany:String = ""
var maxRepeatCount:Int = 0
// Then we loop through them to find which one is most oftenly used
for currentCompany in companies{
let currentCompanyRepeatCount:Int = CoreData_User.count(withCompany: currentCompany, context: context)
if currentCompanyRepeatCount > maxRepeatCount{
maxRepeatedCompany = currentCompany
maxRepeatCount = currentCompanyRepeatCount
}
}
if maxRepeatCount < 1 || maxRepeatedCompany.isEmpty {
return nil
} else {
return maxRepeatedCompany
}
}
static func getDistinctCompanies(context: NSManagedObjectContext ) -> [String]?{
let request:NSFetchRequest<NSFetchRequestResult> = CoreData_User.fetchRequest()
let companyAttributeName:String = "Company"
request.resultType = .dictionaryResultType
request.propertiesToFetch = [companyAttributeName]
request.returnsDistinctResults = true
var results:[String] = [String]()
context.performAndWait{
do{
guard let fetchResults = try context.fetch(request) as? [NSDictionary] else { return }
for item in fetchResults{
if let company = (item as AnyObject).value(forKey: companyAttributeName) as? String{
results.append(company)
}
}
} catch {
print("Failed to get company names")
}
}
if results.count > 0 {
return results
} else {
return nil
}
}
static func count(withCompany company: String, context: NSManagedObjectContext) -> Int{
let request = NSFetchRequest<T>(entityName: type.entity().name!)
request.includesSubentities = false
request.predicate = NSPredicate(format: "Company ==[c] %@", company)
var fetchResult:Int?
context.performAndWait{
fetchResult = try? context.count(for: request)
}
if let count = fetchResult {
return count
} else {
return 0
}
}
}
Приветствуются любые предложения о способах улучшения и оптимизации.