Результаты цикла - PullRequest
       23

Результаты цикла

1 голос
/ 13 декабря 2008

Я немного застрял, и я надеюсь, что кто-то может указать мне правильное направление. У меня есть NSMutableArray, который хранит последовательность. Я создал перечислитель, чтобы цикл while мог получать содержимое массива один за другим.

Все работает нормально, однако я хочу, чтобы методы вызывались с интервалом в 10 секунд между каждым вызовом. Прямо сейчас он играет все сразу (или в очень быстром порядке). На что мне обратить внимание, чтобы создать задержку между вызовами методов?

Ниже то, что я получил до сих пор. Спасибо!

NSEnumerator * enumerator = [gameSequenceArray objectEnumerator];
id element;

while(element = [enumerator nextObject])
{
    NSLog(element);

    int elementInt = [element intValue];
    [self.view showButton:elementInt];
}

Ответы [ 6 ]

3 голосов
/ 14 декабря 2008

Вы почти наверняка не захотите вставлять «задержку» в ваш цикл, которая будет блокировать поток до его завершения (и, если ваше приложение не является многопоточным, блокировать все это). Вы можете использовать несколько потоков, но вместо этого я, вероятно, разделю цикл на повторяющиеся синхронизированные вызовы другого селектора. Сохраните перечислитель (или текущий индекс), а затем посмотрите на executeSelector объекта NSObject: awithObject: afterDelay:

Так что-то вроде

[NSObject performSelector:@selector(some:selector:name:) withObject:objInstance afterDelay: 10]

, где селектор подберет текущий счетчик, использует его, переместит его и запланирует еще один вызов. Убедитесь, что вы не разрешаете вносить изменения в коллекцию во время выполнения этого набора временных методов.

2 голосов
/ 15 декабря 2008

если gameSequenceArray - массив, вам не нужно использовать перечислитель:

NSTimeInterval time = 10;

for (id elementId in gameSequenceArray) {

    [self.view performSelector:@selector(showButton:) withObject:elementID afterDelay:time];
}

и затем вы объявляете showButton:

- (void)showButton:(id)anElement {
    ...
}
2 голосов
/ 14 декабря 2008

Как отступление: вы можете взглянуть на Objective-C 2.0 Быстрое перечисление

2 голосов
/ 14 декабря 2008

Это то, для чего предназначен NSTimer. Используйте NSTimer для последовательного получения каждого элемента в массиве.

1 голос
/ 14 декабря 2008

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

0 голосов
/ 15 декабря 2008

Итак, вот решение, которое я придумал, основываясь на каждом входном сигнале.

NSEnumerator * enumerator = [gameSequenceArray objectEnumerator];

NSTimeInterval time = 5;

for (NSString *element in enumerator) {
    id elementId = element;

    time++;

    [self.view performSelector:@selector(showButton:) withObject:elementId afterDelay:time];
}

Еще раз спасибо, что указали мне правильное направление всем.

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