2011-08-17 11 views
5

2 tür Nesne içeren bir NSMutableArray sahibim.2 tür nesne içeren NSmutableArray öğesini sırala?

Her iki nesne de farklı isimlerle tarihler için (farklı biçimli Dizeler) bir alan içerir.

Bunların tümünü tarihe göre sıralamanın en iyi ve hızlı yolu nedir? Bu durumda NSSortDescriptor kullanmak mümkün mü?

cevap

4

Mac OS X v10.6 veya iOS4 ve hedefliyorsanız Yüksek bunu seçiciye yanıt verip de kontrol edebilir sınıf için denetleme yanında bu

NSDateFormatter *formatter1 = ...; //create and configure date formatter for Class1 
NSDateFormatter *formatter2 = ...; //create and configure date formatter for Class2 


[arrayOfObjects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSDate *date1 = nil, *date2 = nil; 
    //Get first objects date 
    if([obj1 isKindOfClass:[Class1 class]]) 
    { 
     date1 = [formatter1 dateFromString:[obj1 class1Date]]; 
    } 
    else if([obj1 isKindOfClass:[Class2 class]]) 
    { 
     date1 = [formatter2 dateFromString:[obj1 class2Date]]; 
    } 

    //Get second objects date 
    if([obj2 isKindOfClass:[Class1 class]]) 
    { 
     date2 = [formatter1 dateFromString:[obj2 class1Date]]; 
    } 
    else if([obj2 isKindOfClass:[Class2 class]]) 
    { 
     date2 = [formatter2 dateFromString:[obj2 class2Date]]; 
    } 

    NSAssert(date1 != nil, @"Could not parse date from %@", obj1); 
    NSAssert(date2 != nil, @"Could not parse date from %@", obj2); 

    return [date1 compare:date2]; 
}]; 

benzer karşılaştırıcı kullanılarak sıralayabilirsiniz.

+2

oldukça gereksizdir. – Chuck

+0

Evet, NSArray üzerinde birkaç "sortUsing ..." yöntemi vardır ve bunlardan herhangi biri işi yapmalıdır. –

+0

BTW - "isKindOfClass:" veya "responsesToSelector:" işlevini çalıştırmanıza gerek yok. – nielsbot

1

Tarih alanı adını birleştirmek için bir kategori ekleyebilirsiniz. Bunu yapabilirsiniz ... sınıf A'nın örneklerini saha "creationDateString" olan bir alan "dateString" ve sınıf B'nin örneklerini var diyelim:

@implementation A (SortByDate) 

-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.dateString ] ; 
} 
@end 

@implementation B (SortByDate) 
-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.creationDateString ] ; 
} 
@end 

Şimdi onların sortDate özelliği ederek dizideki tüm nesneleri sıralayabilirsiniz:

NSArray * sortedByDateArray = [ unsortedArray sortedArrayUsingComparator:^(id a, id b){ 
    return [ [ a sortDate ] compare:[ b sortDate ] ] ; 
}]; 

DÜZENLEME Veya bir tür tanımlayıcısı ile: id` `dan nesneleri Döküm

NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ; 
+0

, yeni 'sortDate 'özelliğiniz için örnek başına depolama alanı oluşturabilir, böylece yalnızca temel dizeyle yeniden hesaplanması gerekir değişir. – nielsbot