2009-08-28 8 views
12

Sono nuovo di iPhone 3.0 il supporto SDK di Apple di Core Data e io sono relativamente nuovo per lo sviluppo iPhone. La mia domanda è su un ordinamento leggermente più "complesso" di quanto non sia coperto nei documenti. Sospetto che sto facendo un'ipotesi errata e fondamentale.come ordinare un NSMutableArray di Managed Objects attraverso un oggetto grafico

Come posso ordinare una collezione pre-inverosimile di oggetti gestiti da una proprietà contenuta diversi strati più profondi della collezione?

Esempio: Farm ha un 1 a molti Cowboy (Farm.cowboys) Cowboy ha un 1 a 1 per persona (Cowboy.person) persona ha lastName (Person.lastName)

L'intero oggetto il grafico è stato recuperato e i cowboys sono visualizzati tramite UITableView. Ora, come faccio a ordinare i Cowboy di lastName? Devo recuperarli di nuovo? e se sì, come posso farlo con un ordinamento annidato?

Attualmente sto cercando di ordinare un NSMutableArray di cowboys ([tutti gli oggetti di lavoro di Farm.cowboys]) che va bene per quelle proprietà su Cowboy. Ma non sono sicuro di come fare questo lavoro quando si ordina una collezione di Cowboys da Cowboy.person.lastName?

risposta

0

Speriamo che qualcuno abbia una soluzione migliore. Tuttavia ....

Un oggetto involucro con un selettore confrontare e un riferimento alle opere sorta di oggetto. Non è pulito come vorrei, quindi spero che qualcun altro possa trovare un'alternativa.

In sostanza CowboyWrapper ha una proprietà cowboy. CowboyWrapper ha anche un selettore di confronto. Costruendo e mantenendo sincronizzato un NSMutableArray di CowboyWrappers, ordina i lavori.

21

Se è possibile target 10.6, è possibile eseguire questa utilizzando blocchi. In questo modo:

- (NSArray *)sortedArray { 
    return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){ 
    NSString *lastName1 = [[obj1 person] lastName]; 
    NSString *lastName2 = [[obj2 person] lastName]; 
    return [lastName1 caseInsensitiveCompare:lastName2]; }]; 
} 
+2

Anche la pena notare, se si sta utilizzando un 'NSMutableArray', si può semplicemente usare' sortUsingComparator: 'invece, se vuoi . –

+0

È necessario rimuovere il cast su NSComparator. – Psycho

5

È possibile ordinare in questo modo:

[myUnsortedArrayOfCowboys sortedArrayUsingDescriptors: 
    [NSArray arrayWithObject: 
     [NSSortDescriptor 
      sortDescriptorWithKey:"person.lastName" 
      ascending:YES]]]; 

Avviso del '' nella chiave del descrittore di ordinamento. È così che attraversi il grafico dell'oggetto.

1

Se si desidera ordinare il numero e la stringa quindi utilizzare questa

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil]; 
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) { 
    return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch]; 
}]; 
Problemi correlati