J'ai un NSFetchRequest
, qui est de retourner les propriétés d'objets dans un NSDictionaryResultType
. Est-il possible également d'obtenir des objets ObjectId au sein de ce dictionnaire? Sinon je vais avoir besoin pour exécuter la requête avec un type de retour d' NSManagedObjectResultType
ce qui est beaucoup plus lent pour un grand nombre d'articles retournés.
Réponses
Trop de publicités?Oui, vous pouvez, à l'aide de la très chouette mais mal documenté NSExpressionDescription
classe. Vous devez ajouter une correctement configuré NSExpressionDescription
objet de la matrice d' NSPropertyDescription
objets que vous définissez via setPropertiesToFetch:
votre NSFetchRequest
.
Par exemple:
NSExpressionDescription* objectIdDesc = [[NSExpressionDescription new] autorelease];
objectIdDesc.name = @"objectID";
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject];
objectIdDesc.expressionResultType = NSObjectIDAttributeType;
myFetchRequest.propertiesToFetch = [NSArray arrayWithObjects:objectIdDesc, anotherPropertyDesc, yetAnotherPropertyDesc, nil];
NSArray* fetchResults = [myContext executeFetchRequest:myFetchRequest error:&fetchError];
Vous devriez alors avoir un @"objectID"
- clés dans les dictionnaires que vous revenez de votre demande de récupération.
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"yourEntity" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES], nil];
request.predicate = nil;
request.fetchLimit = 20;
NSError *error = nil;
NSArray fetchedResults = [context executeFetchRequest:request error:&error];
NSLog(@"%@", [fetchedResults valueForKey:@"objectID"]);
Depuis votre récupéré les résultats sont déjà dans un tableau, pourquoi ne pas les sortir de la valueForKey:@"objectID" ? Propre, simple seulement besoin d'une demande de récupération de sorte que vous pouvez tirer de toutes les autres données dont vous avez besoin ainsi.
La seule solution que j'ai trouvé pour l'instant est de l'exécution d'une deuxième demande de récupération, qui est similaire à la première demande de récupération à l'exception des différences suivantes:
[fetchRequest setReturnsObjectsAsFaults:YES];
[fetchRequest setPropertiesToFetch:nil];
[fetchRequest setFetchLimit:1];
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed
[request setResultType:NSManagedObjectIDResultType];
Ce sera la cause de la demande de récupération pour retourner un tableau avec exactement un objet, l'voulu objectID. La Performance semble bonne, même lorsque la première demande de récupération du résultat contient 10000 objets.
S'il y a des meilleures façons de gérer cela, je serais heureux si quelqu'un pouvait poster ici.