2017-07-11 1 views
0

Je veux obtenir itmes, en fonction d'une propriété sur les éléments de référence.Trier les éléments en fonction de la référence to-many

comme j'ai quelques boîtes et tous ont des articles et je veux voir les boîtes triées par titre (a, b, c, d, e) mais les boîtes avec les éléments finis d'abord.

    boîte
  • "a" (5 objets)
  • boîte
  • "c" (2 objets)
  • boîte
  • "e" (8 ouvrages)
  • zone "B" (0 produits)
  • box "d" (0 items)

J'ai essayé avec la sous-requête mais je n'ai pas obtenu les bons résultats.

Je souhaite utiliser NSFetchResultController en raison de mises à jour en cours d'utilisation.

let sortDescriptors = [ 
NSSortDescriptor(key: "(SUBQUERY(items,$item,$item.finished == 0)[email protected] > 0)", ascending: false), 
NSSortDescriptor(key: "title", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare)) 
] 

Est-ce que quelqu'un a une idée comment résoudre ce problème?

J'ai essayé aussi d'utiliser le sectionNameKeyPath mais avec

let sectionKeyPath = "((items.finished == 0)[email protected] > 0)" 

j'ai obtenu "Message du débogueur: classés en raison du problème de mémoire"

code:

extension ManagedBox { 

@nonobjc open override class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> { 
    return NSFetchRequest<ManagedBox>(entityName: "ManagedBox") as! NSFetchRequest<NSFetchRequestResult>; 
} 

@NSManaged public var paused: Bool 
@NSManaged public var title: String? 

@NSManaged public var items: NSSet? 
} 

extension ManagedItem { 

@nonobjc open override class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> { 
    return NSFetchRequest<ManagedItem>(entityName: "ManagedItem") as! NSFetchRequest<NSFetchRequestResult>; 
} 

@NSManaged public var finished: Bool 
@NSManaged public var title: String? 

@NSManaged var box: ManagedBox? 
} 
+0

S'il vous plaît code postal pour votre classe de boîte et comment vous implémentez le titre ou les éléments –

Répondre

0

Avec CoreData et SQLite backing store, vous ne pouvez trier que par attributs persistants. Une solution serait donc d'ajouter un nouvel attribut hasFinishedItems persistant à votre entité ManagedBox et de vous assurer de le mettre à jour chaque fois que les ManagedItems associés sont mis à jour.

Mais je pense qu'une meilleure solution serait d'utiliser deux contrôleurs récupérés résultats: un pour gérer les objets ManagedBoxavec éléments finis, et un autre pour gérer les sans éléments finis. Les deux CRF seraient triés en utilisant l'attribut title, mais on aurait un prédicat comme suit:

SUBQUERY(items,$item,$item.finished == 0)[email protected] > 0 

et l'autre aurait le prédicat complémentaire:

SUBQUERY(items,$item,$item.finished == 0)[email protected] == 0 

Vos méthodes datasource/délégué tableView serait alors besoin d'avoir deux sections, la première étant remplie en utilisant la première FRC, et la seconde étant remplie en utilisant la deuxième FRC. De même, les méthodes déléguées FRC devront s'assurer que les modifications déclenchées par la première section FRC mettent à jour la table 0, alors que les modifications sont déclenchées par la deuxième section FRC update 1. A condition de faire attention à remapper l'indexPath du FRC au bon indexPath pour le téléviseur (et vice versa), cela devrait fonctionner correctement.

+0

la solution avec deux fetchresultcontroller peut aider. ils travaillent. mais je ne sais pas s'il y aura une limite de mémoire pour trouver toutes ses boîtes. Je vais le tester –

+0

@ JeanetteMüller Vous pouvez spécifier 'fetchBatchSize' pour les extractions sous-jacentes à la FRC, afin de limiter le nombre de boîtes chargées en mémoire. – pbasdf