Если вы используете привязки, у вас есть только два варианта: (1) привязать к пользовательскому объекту, у которого есть ключ, который возвращает отсортированный массив, или (2) использовать дескриптор сортировки, который рандомизирует вместо упорядочивания.
Второй вариант проще в некоторых обстоятельствах. Чтобы создать дескриптор рандомизированной сортировки, вы можете (1) создать подкласс NSSortDescriptor и переопределить compareObject:toObject:
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2{
NSUInteger ran=(arc4random() % 3);
switch (ran) {
case 0:
return NSOrderedSame;
break;
case 1:
return NSOrderedDescending;
default:
return NSOrderedAscending;
break;
}
}
или (2) предоставляют селектор или блок, который обеспечивает случайное упорядочение таким же образом:
NSSortDescriptor *rs=[NSSortDescriptor sortDescriptorWithKey:@"intValue"
ascending:YES
comparator:^(id obj1, id obj2){
NSUInteger ran=(arc4random() % 3);
switch (ran) {
case 0:
return NSOrderedSame;
break;
case 1:
return NSOrderedDescending;
default:
return NSOrderedAscending;
break;
}
}];
Недостаток (2) заключается в том, что вы должны предоставить ключ, который должен понять сортируемый объект, например, в приведенном выше примере я отсортировал массив объектов NSNumber, поэтому я должен предоставить ключ intValue
, на который отвечает NSNumber. Метод подкласса на самом деле не заботится о ключах.
Однако использование сортировок возвращает только слабо рандомизированный массив, потому что рандомизация - это просто неправильная сортировка, т. Е. Большинство элементов не перемещаются в массиве очень далеко. Чтобы создать более рандомизированный эффект, поместите рандомизирующие сортировки в массив так, чтобы они делали несколько проходов по массиву, например ::
[ aMutableArray sortUsingDescriptors:[NSArray arrayWithObjects:rs,rs,rs, nil]];
Если вы используете привязки, просто используйте рандомизированные дескрипторы сортировки, где вы используете нормальный дескриптор сортировки, и вы должны получить что-то полезное рандомизированное.