2013-11-15 58 views
0

我使用NSSortDescriptor排序與firstName的聯繫人,但如果第一個名字是零,排序它將是錯誤的。NSSortDescriptor優先

,如果我有:

接觸1:姓= BAAAA和LastName = XXXXXX

接觸2:姓=零和LastName = AAAAAA

排序它會像這個。

1- AAAAAAA

2- BAAAA XXXXXX

,所以我需要知道,如果存在的解決方案,使名字和姓氏之間的優先級。

Firstname ==nil如果所以採取名字

由於

回答

1
NSSortDescriptor *descriptor1 = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES]; 
NSSortDescriptor *descriptor2 = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]; 
NSArray *sorted = [contatcs sortedArrayUsingDescriptors:@[descriptor1, descriptor2]]; 

陣列中的描述符的順序決定優先級。對於核心數據的查詢,那麼會是這樣的

NSManagedObjectContext *moc = [self managedObjectContext]; 
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:moc]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entityDescription]; 

[request setSortDescriptors:@[descriptor1, descriptor2]]; 

NSError *error; 
NSArray *array = [moc executeFetchRequest:request error:&error]; 
if (array == nil) 
{ 
    // Deal with error... 
} 
+0

感謝您的答覆。 但是,如果我想用NSSortDescriptors創建一個提取請求(核心數據),我該怎麼做。 這是一個數組排序不是獲取請求。 – Bacem

+0

我發佈了核心數據代碼... – jbat100

0

你也可以繼承NSSortDescriptor並重寫compareObject:toObject:方法:

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 { 
    NSString *firstName1 = [object1 valueForKey:@"firstName"]; 
    NSString *lastName1 = [object1 valueForKey:@"lastName"]; 

    NSString *firstName2 = [object2 valueForKey:@"firstName"]; 
    NSString *lastName2 = [object2 valueForKey:@"lastName"]; 

    if(firstName1 == nil || firstName2 == nil) { 
     return [lastName1 compare:lastName2]; 
    } 

    return [firstName1 compare:firstName2]; 
}