Приостановка итерации цикла for для ожидания ввода пользователя - PullRequest
0 голосов
/ 30 апреля 2011

Я написал цикл for, который перебирает массив объектов.Теперь я спрашиваю себя, можно ли прервать итерацию цикла, пока пользователь не нажмет кнопку, которая вызывает IBAction?

for (int i = 0; i < [array count]; i++) {
   // do something with the object

   // wait for action method called
   // user clicked action so go on
}

Ответы [ 2 ]

4 голосов
/ 30 апреля 2011

Вы можете адаптировать код под ваш случай.Это в основном «разворачивает» цикл в несколько сообщений.Начните последовательность с [self doItForIndex:[NSNumber numberWithInt:0]];

- (BOOL)canDoitForIndex:(NSNumber *)i {
    // return YES if you want to go ahead
    // (e.g. test a BOOL you set in response to the user tapping a button
}

- (void)waitForIndex:(NSNumber *)i {
    if ([self canDoItForIndex:i]) {
        // do anything to clean up for i
        // then repeat for i+1:
        [self doItForIndex:[NSNumber numberWithInt:[i intValue]+1]];
    } else {
        [self performSelector:_cmd withObject:i afterDelay:0.01f;
    }
}

- (void)doItForIndex:(NSNumber *)i {
    if ([i intValue] < lastIndex) {
        // do what you have to do
        [self waitForIndex:i];
    }
    // else you're done
}

Концепция Apple NSRunLoop предполагает, что вы завершите обработку довольно быстро.Если вы связываете основной поток, ожидая чего-то, в вашем приложении больше ничего не произойдет.Приведенный выше код разбивает «ожидание» на несколько отправок сообщений и поддерживает отзывчивость вашего приложения.

1 голос
/ 11 марта 2012

Алгоритм ODRM работает очень хорошо. Я только что изменил эту строку:

[self performSelector:_cmd withObject:i afterDelay:0.01f];

с этим:

   [NSThread sleepForTimeInterval:0.25];  
   [NSThread detachNewThreadSelector:_cmd toTarget:self withObject:i];

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

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