Предоставление случайного порядка для выборки основных данных - PullRequest
3 голосов
/ 31 марта 2011

У меня есть приложение Mac с прокруткой, которая отображает список элементов.Данные для элементов предоставляются из Core Data.Мне нужно предоставить кнопку «Перемешать», с помощью которой можно рандомизировать порядок элементов в представлении прокрутки.

1 Ответ

2 голосов
/ 01 апреля 2011

Если вы используете привязки, у вас есть только два варианта: (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]];

Если вы используете привязки, просто используйте рандомизированные дескрипторы сортировки, где вы используете нормальный дескриптор сортировки, и вы должны получить что-то полезное рандомизированное.

...