6

Estoy tratando de ordenar por fecha y hora de inicio. La hora de inicio es minutos desde la medianoche. Entonces, si la hora de inicio es < 100, no se ordenará correctamente.NSSortDescriptor no ordenando enteros correctamente

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 

    /* 
    Set up the fetched results controller. 
    */ 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setIncludesPendingChanges:YES]; 

    // Set the batch size to a suitable number. 
    //[fetchRequest setFetchBatchSize:20]; 

    // Sort using the date/then time property. 
    NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
    NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorDate, sortDescriptorTime, nil]; 


    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Use the sectionIdentifier property to group into sections. 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[DataManager sharedInstance] managedObjectContext] sectionNameKeyPath:@"date" cacheName:@"List"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 
    NSLog(@"FetchedController: %@", fetchedResultsController); 
    return fetchedResultsController; 
} 

¿Cómo puedo hacer esta clasificación enteros correctamente?

+0

I * hope * your start_time (en su modelo de objetos de Core Data) es un objeto NSNumber y no una cadena. –

Respuesta

27

Si hora_inicial es una cadena, entonces se ordenará alfabéticamente lo que significa que es aa antes b que también significa que es 11 antes 2.

Para ordenar de una manera más humana, use NSString 's localizedStandardCompare: como selector.

[NSSortDescriptor sortDescriptorWithKey:@"start_time" ascending:YES selector:@selector(localizedStandardCompare:)] 
+0

¡Eso fue todo! Gracias. Lo tengo en mis datos básicos como una cadena porque proviene de la API como una cadena y no como un número. – Bot

+2

esto es increíble. Exactamente lo que estaba buscando. Tuve el problema de que mi columna de cadena se ordenó de esta manera 1,10,11,2,3,4 ... la solución anterior lo resolvió. – shaikh

+0

NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey: @ "dateTimeInSec" ascendente: YES selector: @selector (localizedStandardCompare :)]; se estrelló mi aplicación. ¿Start_time es un tipo de atributo NSString o NSNumber? El error fue - [__ NSCFNumber localizedStandardCompare:]: selector no reconocido enviado a la instancia 0x16dc40c0 con userInfo (null) – coolcool1994

Cuestiones relacionadas