Как сортировать с помощью NSSortDescriptor и сложной логики?

У меня есть следующий код, который сортируется по возрастанию.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"someproperty.name" ascending:YES];
    NSMutableArray   *sortedReleases = [NSMutableArray arrayWithArray:[unsortedarray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]];
    [sortDescriptor release];

Я хочу сделать сортировку, где:

Покажите те, где за sortedRelease следует активный текущий пользователь (сложная логика, которая идет в функции??)

Это то, что мне нужно в моей пользовательской функции:

for (Release *release in sortedReleases){

if( [[[MainController sharedMainController] activeUser] isFollowingRelease:release] ){

return NSOrderedAscending;
}

}

Отсортируйте остальные, используя acsending (как это делается сейчас)

Как мне это сделать?

Я знаю, что задавал этот вопрос ранее, и, возможно, я задал его неправильно, но это было не то, что я искал. Я хочу иметь возможность сортировать на основе результата функции. А потом по алфавиту.

ОБНОВЛЕННЫЙ КОД:

 NSArray *sortedReleases = [theReleases sortedArrayUsingComparator:^(id a, id b) {
        Release *left = (Release*)a;
        Release *right = (Release*)b;


        if(( [[[MainController sharedMainController] activeUser] isFollowingRelease:left] )&&([[[MainController sharedMainController] activeUser] isFollowingRelease:right])){

           //sort alphabetically ????
        }
        else if (([[[MainController sharedMainController] activeUser] isFollowingRelease:left])&&(![[[MainController sharedMainController] activeUser] isFollowingRelease:right]))
        {
            return (NSComparisonResult)NSOrderedDescending;
        }
        else if ((![[[MainController sharedMainController] activeUser] isFollowingRelease:left])&&([[[MainController sharedMainController] activeUser] isFollowingRelease:right]))
        {
             return (NSComparisonResult)NSOrderedAscending;
        }

        return [left compare:right]; //getting a warning here about incompatible types
    }];

person jini    schedule 12.12.2011    source источник


Ответы (1)


Вот как вы сортируете массивы, используя пользовательскую логику, с сортировкой по алфавиту для разрешения конфликтов:

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id a, id b) {
    Release *left = (Release*)a;
    Release *right = (Release*)b;
    BOOL isFollowingLeft = [[[MainController sharedMainController] activeUser] isFollowingRelease:left];
    BOOL isFollowingRight = [[[MainController sharedMainController] activeUser] isFollowingRelease:right];
    if (isFollowingLeft && !isFollowingRight) {
        return (NSComparisonResult)NSOrderedDescending;
    } else if (!isFollowingLeft && isFollowingRight) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    return [left.name compare:right.name];
}];
person Sergey Kalinichenko    schedule 12.12.2011
comment
Да, он будет работать с iOS 4.0 или новее. Это означает, что поддерживается все аппаратное обеспечение, кроме iPhone и iPod Touch 1-го поколения, если пользователь специально не решил не устанавливать бесплатное обновление (например, потому что его телефон взломан). Альтернативой обратной совместимости является sortedArrayUsingSelector:, но вам рекомендуется использовать новый блочный API, опубликованный @dasblinkenlight. - person Abhi Beckert; 12.12.2011
comment
Да: согласно документации Apple, эта функция Available in iOS 4.0 and later. - person Sergey Kalinichenko; 12.12.2011
comment
Пожалуйста, простите мое невежество, поскольку я полный новичок, но я могу только спрашивать и учиться. Я обновил свой код. Цель снова состоит в том, чтобы показать выпуски, за которыми следят первыми, а остальные в алфавитном порядке. Это выглядит нормально? - person jini; 12.12.2011
comment
@jini Вы должны проверить isFollowingRelease слева и справа. Если ответ совпадает, приступайте к сортировке по алфавиту. Если left следует за релизом, а right нет, вернуть ascending; если right следует за релизом, а левый нет, вернуть descending. - person Sergey Kalinichenko; 12.12.2011
comment
@dasblinkenlight Пожалуйста, не убивайте меня :) Я обновил свой код, но не был уверен, как сортировать по алфавиту. У меня действительно сложная задача с пониманием сортов. Я понимаю основные, но это немного сложно. Я действительно посетил сайт Apple. Я очень ценю, что ты помогаешь мне. - person jini; 12.12.2011
comment
@jini Вы должны добавить имя строкового свойства, по которому вы хотите отсортировать в алфавитном порядке. Например, если у выпусков есть имена, используйте return [left.name compare:right.name];. - person Sergey Kalinichenko; 12.12.2011
comment
@dasblinkenlight хорошо, я так и сделаю. Но что мне поместить в первый блок if? Я должен тебе стейк на ужин. - person jini; 12.12.2011