Случайное заполнение очереди в Obj-C - PullRequest
0 голосов
/ 25 июля 2011

Сейчас я настраиваю очередь на основе имен изображений, которая работает нормально.Он просматривает изображения с 0 по 13 и добавляет их в очередь.

loadImagesOperationQueue = [[NSOperationQueue alloc] init];

NSString *imageName;
for (int i=0; i < 13; i++) {
    imageName = [[NSString alloc] initWithFormat:@"cover_%d.jpg", i];
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i];
    NSLog(@"%d is the index",i);

}

Это работает безупречно;очередь устанавливается от cover_0.jpg до cover_13.jpg.Однако я хочу добавить немного случайности.Если я просто использую arc4random(), я, несомненно, получу одно и то же изображение, добавленное в очередь несколько раз.Логично, как я могу получить arc4random(), чтобы быть эксклюзивным.Добавление выбранных чисел в строку, а затем проверка их по текущему выводу и, при необходимости, повторение arc4, является избыточным и неэффективным.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Сделайте что-нибудь подобное.

NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:14];

for (int i = 0; i < 13; i++) {
    [tmpArray addObject:[NSString stringWithFormat:@"cover_%d.jpg", i]];
}

for (int i = 0; i < 13; i++) {
    int index = arc4random() % [tmpArray count];
    NSString *imageName = [tmpArray objectAtIndex:index];
    [tmpArray removeObjectAtIndex:index];
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i];
}

[tmpArray release];

И ваш код не должен работать без нареканий.Вы протекаете imageName.

0 голосов
/ 25 июля 2011

Я бы сделал это, сначала заполнив массив именами изображений, а затем случайным образом выбрав значения:

NSMutableArray * imageNames = [NSMutableArray array];
for (int i = 0; i < 13; i++) {
    NSString * iName = [NSString stringWithFormat:@"cover_%d.jpg", i];
    [imageNames addObject:iName];
}
while ([imageNames count] > 0) {
    int index = arc4random() % [imageNames count];
    NSString * iName = [imageNames objectAtIndex:index];
    [imageNames removeObjectAtIndex:index];
    // load image named iName here.
}
...