2017-05-15 1 views
0

J'ai une NSManagedObject que je suis PRÉPONDÉRANTS le getter pour l'une des propriétés parce que je veux faire des calculs pour la valeur de retour de cette propriété:NSManagedObject personnalisée getter ne fonctionne pas pour NSSortDescriptor

- (NSNumber *)distanceFromCurrentUserLocation { 

    [self willAccessValueForKey:@"distanceFromCurrentUserLocation"]; 

    // Update Distance 
    CLLocation *placeLocation = [[CLLocation alloc] initWithLatitude:self.coordinate.latitude longitude:self.coordinate.longitude]; 
    CLLocation *currentLocation = [[MyHelper sharedService] currentLocation]; 

    CLLocationDistance distance = [placeLocation distanceFromLocation:currentLocation]; 

    [self didAccessValueForKey:@"distanceFromCurrentUserLocation"]; 

    return @(distance); 

} 

je puis faire une demande de récupération et tournai ma sortDescriptors:

// Initialize Fetch Request 
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"ZSSCDPerson"]; 

// Sorting 
[request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"distanceFromCurrentUserLocation" ascending:ascending]]]; 

Est-ce que les descripteurs de tri pas appeler cette méthode?

+0

Est-ce utile? http://stackoverflow.com/questions/17853496/nssortdescriptor-on-transient-attribute-for-nsfetchedresultscontroller – danh

+0

Type de magasin de base de données SQLite? Non, la requête d'extraction est traduite en SQL et les sous-classes 'NSManagedObject' ne sont pas utilisées. – Willeke

+0

Oui, type de magasin de base de données SQLite. –

Répondre

0

Vous ne pouvez pas trier une requête d'extraction sur une valeur non stockée.

Vous avez deux options.

  1. Calculez et enregistrez la valeur, vous devez la mettre à jour chaque fois que l'emplacement actuel de l'utilisateur change. Peut-être pas idéal pour quelque chose qui change beaucoup comme l'emplacement de l'utilisateur cependant.

  2. Fetch puis tri. Récupère tous tes objets dans un tableau puis trier en mémoire.

+0

J'ai essayé d'éviter de chercher puis de trier. Raison étant que cela met plus de temps pour mettre à jour un contexte privé, puis fusionner avec le contexte de thread principal. –

+0

Vous pouvez essayer d'extraire un sous-ensemble de vos données (c'est-à-dire juste les informations de localisation) pour trouver l'ordre requis, puis faire l'extraction complète en utilisant cette information. – trapper

+0

Voulez-vous dire simplement récupérer les attributs dont j'ai besoin pour le calcul? Je devrais encore faire une boucle à travers ces résultats pour faire le calcul de la distance d'emplacement sur chaque résultat. –