2012-05-18 3 views
0

Cette requête d'extraction prend près de 10 secondes à s'exécuter sur l'iPhone. Le but est d'extraire 1 vignette aléatoire de chaque catégorie. Paramètre fetchlimit = 1 la plupart du temps renvoie la même vignette, donc je dois aller chercher toutes les photos de chaque catégorie.Core Data Optimize Fetch Request

Des idées?

[categoriesArray enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) { 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photos"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"place.subcategory.category == %@", object]; 
    [request setPredicate:predicate]; 
    NSError *error; 
    NSArray *photosManagedObjectsArray = [managedObjectContext executeFetchRequest:request error:&error]; 

    NSUInteger randomIndex = arc4random() % [photosManagedObjectsArray count]; 

    NSManagedObject *photoObject = [photosManagedObjectsArray objectAtIndex:randomIndex]; 
    UIImage *photoImage = [UIImage imageWithData:[photoObject valueForKey:@"thumbnail"]]; 
    UIImage *resizedImage = [photoImage imageCroppedToFitSize:CGSizeMake(IMAGE_WIDTH, IMAGE_HEIGHT)]; 
    [imagesArray addObject:resizedImage]; 
    [objectsArray addObject:photoObject]; 

}]; 

merci beaucoup! Projet de loi.

+1

essai en utilisant '' propriété fetchOffset' de NSFetchRequest' comme un nombre entier aléatoire compris entre 0 et (numberOfPics - 1) – Eimantas

+0

grâce, je suis totalement ignorant fetchOffset. – Nimrod7

Répondre

3

Vous n'avez pas besoin de tirer tous vos objets dans un tableau. Il suffit de changer

NSArray *photosManagedObjectsArray = [managedObjectContext executeFetchRequest:request error:&error];` 
NSUInteger randomIndex = arc4random() % [photosManagedObjectsArray count]; 

à cette

NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error]; 
NSUInteger randomIndex = arc4random() % count; 

utiliser maintenant fetchOffset pour saisir tout l'objet unique dont vous avez besoin.

[request setFetchOffset:randomIndex]; 
[request setFetchLimit:1]; 
+0

Merci beaucoup. J'ignorais totalement l'existence de fetchOffset. – Nimrod7