Как я могу перетасовать NSArray? - PullRequest
0 голосов
/ 07 июня 2010

Все примеры, которые я нахожу для перемешивающих массивов, относятся к NSMutableArrays. Копирование NSArray в массив NSMutable, перемешивание, затем копирование обратно всегда приводит к сбою приложения. Можно ли вообще перетасовать NSArray?

Что-нибудь в target-c, похожее на Collections.shuffle () (Java)?

Редактировать

static NSUInteger random_below(NSUInteger n) {
NSUInteger m = 1;

do {
    m <<= 1;
} while(m < n);

NSUInteger ret;

do {
    ret = random() % m;
} while(ret >= n);

return ret;
}
- (NSArray *)loadAllData{
    XYZAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Quote" inManagedObjectContext:managedObjectContext]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];  
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];   

    [request setSortDescriptors:sortDescriptors];
    [request setEntity: entity]; 

    NSError *myError;   
    NSArray *theResults = [managedObjectContext executeFetchRequest:request error:&myError];

    if (theResults == nil) {
        NSLog(@"Testing: No results found");
    }else {
        NSLog(@"Testing: Results found.");
    }

    [request release];
    [sortDescriptors release];

    for(NSUInteger i = [theResults count]; i > 1; i--) {
        NSUInteger j = random_below(i);
        [theResults exchangeObjectAtIndex:i-1 withObjectAtIndex:j];
    }

    return theResults;
}




warning: 'NSArray' may not respond to '-exchangeObjectAtIndex:withObjectAtIndex:' which crashed the application.     

error: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_PFArray exchangeObjectAtIndex:withObjectAtIndex:]: unrecognized selector sent to instance 0x3d35a40

1 Ответ

2 голосов
/ 07 июня 2010

OK. Я думаю, что вижу проблему. Всегда смотрите на сообщение об ошибке. Я думал, вы сказали, что используете NSMutableArrays в этой функции?

NSArray *theResults = [managedObjectContext executeFetchRequest:request error:&myError];

Измените это на

NSMutableArray *theResults = [[managedObjectContext executeFetchRequest:request error:&myError] mutableCopy];

Скажите мне, если это работает, и если это не так, я постараюсь помочь.

Дополнительная информация:

-exchangeObjectAtIndex:withObjectAtIndex:

- это метод для NSMutableArray. Вы использовали NSArray, это разные классы (NSMutableArray является подклассом (и добавляет методы, которые означают, что вы можете изменить его) NSArray).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...