2017-02-17 4 views
0

Я хочу перетасовать/рандомизировать порядок элементов внутри моего NSMutableArray при выполнении метода reloadData. Я попробовал это ниже, но консоль продолжает бросать мне следующую ошибку:iOS - Shuffle/Randomized порядок объектов в NSMutableArray

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI exchangeObjectAtIndex:withObjectAtIndex:]: unrecognized selector sent to instance 0x1748b2c60'

Любая идея, почему это может быть? Я в тупике.

ViewController.h

@property (strong, retain) NSMutableArray *neighbourData; 

ViewController.m

- (void)reloadData:(id)sender 
{ 


    NSMutableDictionary *viewParams = [NSMutableDictionary new]; 
      [viewParams setValue:@"u000" forKey:@"view_name"]; 
      [DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) { 



       self.neighbourData = (NSMutableArray *)responseObject; 

       [self.tableView reloadData]; 

       NSUInteger count = [self.neighbourData count]; 
       for (NSUInteger i = 0; i < count; ++i) { 
        // Select a random element between i and end of array to swap with. 
        int nElements = count - i; 
        int n = (arc4random() % nElements) + i; 
        [self.neighbourData exchangeObjectAtIndex:i withObjectAtIndex:n]; 
       } 


       NSLog(@"This is the neighbourdata %@",self.neighbourData); 


      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       NSLog(@"Failure: %@", [error localizedDescription]); 
      }]; 

ответ

2

Ошибка указывает на то, что на самом деле responseObject не-изменяемые NSArray. Приведение, которое вы применяете, просто лежит на компиляторе, но на самом деле ничего не меняет во время выполнения.

Изменение:

self.neighbourData = (NSMutableArray *)responseObject; 

к:

self.neighbourData = [(NSArray *)responseObject mutableCopy]; 
+0

Для ОП это важный момент для изучения. Приведение переменной в другой тип не изменяет тип базового объекта. Это просто заставляет компилятор * думать * это другой тип. Если объект ** не ** измененный массив, вам нужна функция (mutableCopy), которая берет неизменяемый массив в качестве параметра и возвращает вам новый измененный массив, содержащий одни и те же объекты. –

0

Для производства вы действительно должны использовать встроенный в Fisher-Yates shuffle in Gamekit. Если вы делаете это, опираясь цели, то проблема в линии:

int n = (arc4random() % nElements) + i; 

Вы делаете случайное число от первого до последнего элемента , а затем вы добавляете я к. Очевидно, это означает, что ваш индекс теперь может быть вне пределов. Избавьтесь от + i.

+0

Этот ответ не пытается решить проблему, представленную в вопросе. – rmaddy

+0

Это действительный момент, но, как сказал rmaddy, это не ответ на вопрос, который был задан. –

0

self.neighbourData = (NSMutableArray *)responseObject; Вы должны убедиться, что ваш объект responseObject является экземпляром NSMutableArray здесь. Несмотря на то, что вы передали тип responseObject в NSMutableArray, он будет сбой, если он не является экземпляром NSMutableArray, потому что в дозе не имеется exchangeObjectAtIndex: withObjectAtIndex :. В этом случае ваш responseObject является экземпляром NSArray, вы можете изменить код на: NSArray *tmp = (NSArray *)responseObject; self.neighbourData = [tmp mutableCopy]; Я думаю, это работает для вас.

Смежные вопросы