最初に言ったように、最初に awardOn で、次にタイトルで、2 つの記述子を使用してそれを行うことができるはずです。ただし、次のような awardOn ソート用のカスタム NSSortDescriptor を提供する必要があります。
#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]])
@interface AwardedOnSortDescriptor : NSSortDescriptor {}
@end
@implementation AwardedOnSortDescriptor
- (id)copyWithZone:(NSZone*)zone
{
return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
if (NULL_OBJECT([object1 valueForKeyPath:[self key]])) {
if (NULL_OBJECT([object2 valueForKeyPath:[self key]]))
return NSOrderedSame; // If both objects have no awardedOn field, they are in the same "set"
return NSOrderedDescending; // If the first one has no awardedOn, it is sorted after
}
if (NULL_OBJECT([object2 valueForKeyPath:[self key]])) {
return NSOrderedAscending; // If the second one has no awardedOn, it is sorted after
}
return NSOrderedSame; // If they both have an awardedOn field, they are in the same "set"
}
@end
これにより、あなたの例では、Awesome / Better / CoolとAnother / Another One / One More / Yet anotherのセットを分離する必要があります。その後、次のことが得意になるはずです。
NSSortDescriptor *sortDescriptor1 = [[AwardedOnSortDescriptor alloc] initWithKey:@"awardedOn" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
最後に、「空」の awardOn フィールドがどのように見えるかによっては、もう少し作業が必要になる場合があります (上記のコードでは、フィールドが null に設定されていると仮定しました)。ここで見ることができます:https://stackoverflow.com/a/3145789