2013-02-18 14 views
8

In fetchedResultsController mentre si impostano le NSSortDescriptor IAM questo errore supportati NSSortDescriptor (blocchi comparatori non sono supportati).NSSortDescriptor non supportati (blocchi comparatori non sono supportati)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Alarm" inManagedObjectContext: managedObjectContext]; 
[fetchRequest setEntity:entity]; 

//Below code is not working and causing error. sorting use the hours&seconds part of the time attribute 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
          initWithKey:@"time" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { 

            NSCalendar *calendar = [NSCalendar currentCalendar]; 
            NSDateComponents *components1 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj1]; 
            NSDateComponents *components2 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj2]; 
            NSDate *date1 = [calendar dateFromComponents:components1]; 
            NSDate *date2 = [calendar dateFromComponents:components2]; 


            return [date1 compare:date2]; 

          }]; 

risposta

8

Non è possibile utilizzare i descrittori di ordinamento con blocchi di comparatori in tutto il mondo, ad esempio non con i recuperi di dati di base.

funzionano bene quando si filtrano le matrici normali, però.

A parte questo - c'era una domanda in là che ho trascurato?

+1

che cosa posso fare per ottenere il risultato di cui sopra? –

+1

@Anil Beh, un modo semplice potrebbe essere quello di estrarre tutti i dati in una matrice, quindi ordinare quella matrice con il descrittore di ordinamento dal codice. – Monolo

+2

Mi è piaciuto. Ordinamento esternamente dopo il recupero. Ma il problema che sto usando 'controller: (NSFetchedResultsController *) controller ha fattoChangeObject: (id) anObject atIndexPath: (NSIndexPath *) indexPath forChangeType: (NSFetchedResultsChangeType) digita newIndexPath: (NSIndexPath *) newIndexPath' per aggiornare la vista tabella. Durante l'eliminazione, un'altra riga su indexpath viene eliminata. –

2

Come ha detto Monolo, non è possibile utilizzare i comparatori bloccano con Core Data. Tuttavia, è possibile utilizzare:

[NSSortDescriptor sortDescriptorWithKey:(NSString *) ascending:(BOOL) selector:(SEL)] 

Avrai bisogno di estendere il modello, se non si utilizza un selettore standard.

Per esempio, ho solo bisogno di ordinare le stringhe "alla Finder" (cioè 1,2,9,10, e non 1,10,2,9) e ho usato

request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:myEntity ascending:NO selector:@selector(localizedStandardCompare:)]]; 

Take a guardare al NSSortDescriptor Class Reference by Apple

felice di codifica :)

+0

non funziona nei dati principali. L'ordinamento avviene nel backend SQLite. localizedStandardCompare funziona, probabilmente perché è un selettore di NSString e Apple ha fatto qualcosa per tradurre il suo confronto. –

+0

Mi spiace, non capisco il tuo commento: ho iniziato la mia risposta con "non puoi utilizzare il blocco di comparatori con i dati di base", immagino sia ovvio che non funziona nei dati di base ... –

+1

intendo il selettore non funziona nemmeno sui dati di base. come se avessimo un '@selector (fancyCompare:)' sul modello. Non funziona con Core Data. –

Problemi correlati