J'utilise un NSFetchedResultsController dans une application iPhone et je me demande s'il existe un moyen simple d'obtenir le nombre total de lignes renvoyées dans toutes les sections.
Au lieu d'obtenir le nombre [[fetchedResultsController sections]], puis de parcourir en boucle chaque section pour obtenir son nombre, peut-il être effectué sur une seule ligne?
Merci!
Cette ligne retourne le nombre total d'objets récupérés:
[fetchedResultsController.fetchedObjects count]
Celui-ci, ça va?
[fetchedResultsController.sections.valueForKeyPath: @"@sum.numberOfObjects"];
Cela ne touchera pas du tout les objets récupérés, il est donc garanti de ne pas leur en vouloir.
Rapide.
fetchedResultsController.fetchedObjects?.count
Swift 4:
La suggestion de Max Desiatov comme extension de Swift:
import Foundation
import CoreData
extension NSFetchedResultsController {
@objc var fetchedObjectsCount: Int {
// Avoid actually fetching the objects. Just count them. Why is there no API like this on NSFetchResultsController?
let count = sections?.reduce(0, { (sum, sectionInfo) -> Int in
return sum + sectionInfo.numberOfObjects
}) ?? 0
return count
}
}
Usage:
let objectCount = fetchedResultsController.fetchedObjectCount
Ou faites-le comme une routine en ligne:
// Avoid actually fetching objects. Just count them.
let objectCount = fetchedResultsController.sections?.reduce(0, { $0 + $1.numberOfObjects }) ?? 0
Remarque: Le @objc
est nécessaire pour éviter cette erreur de compilation:
L'extension d'une classe Objective-C générique ne peut pas accéder aux paramètres génériques de la classe à l'exécution
(Voir Comment écrire une extension pour NSFetchedResultsController dans Swift 4 )