мне нужно сделать для цикла и между каждой петлей подождите 2 секунды и продолжитьвремя сна в течение цикла
for (int i = 0; i < [stories count]; i++) {
//my code
//sleep 2 seconds and continue
}
Как я могу это сделать?
мне нужно сделать для цикла и между каждой петлей подождите 2 секунды и продолжитьвремя сна в течение цикла
for (int i = 0; i < [stories count]; i++) {
//my code
//sleep 2 seconds and continue
}
Как я могу это сделать?
[NSThread sleepForTimeInterval:2.0];
Проблема с этим состоит в том, что он будет блокировать пользовательский интерфейс для 2 * [stories count]
секунд-конечно, достаточно долго для пользователя, чтобы заметить, что ваше приложение не отвечает, и, кажется, зависла. Плохо.
Используйте таймер вместо этого и сохраните индекс (если вам действительно нужен индекс) или NSEnumerator ([stores objectEnumerator]
) в таймере userInfo
. Внедрите свой метод обратного вызова по таймеру для работы только с одним объектом. Если вы используете индексы, этот метод также должен заменить индекс в userInfo
следующим. Его последний шаг будет состоять в том, чтобы проверить, закончились ли вы элементы, и если да, вызовите метод, в котором вы аннулируете и освобождаете таймер (который вы также должны вызывать от dealloc
).
В этом отношении я задаю вопрос, почему вам нужно ждать две секунды между операциями. Если вы ожидаете, что что-то произойдет, вы действительно должны дождаться этого и ждать дольше, если необходимо, вместо жесткого кодирования фиксированного двухсекундного интервала между операциями.
Peter Hosey прав насчет блокировки нити пользовательского интерфейса, которую часто называют основной нитью. Но я думаю, что его решение изогнуто.
Простое решение 1: Вызов метода где длинная петля блокировка находится на фоне потока с помощью:
[self performSelectorInBackground:@selector(longRunningMethod)
withObject:nil];
Простое решение 2: Добавить метод, где длинная петля блокировка является к NSOperationsQueue:
NSOperationQueue* oq = [[NSOperationQueue new] autorelease];
NSOperation* o = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(longRunningMethod)
object:nil]
[oq addOperation:o];
[o release];
Увольнение селекторов в фоновом режиме проще, почти слишком просто, поскольку они могут дренировать ресурсы, если они используются для дико.
Использование NSOperationQueue требует нескольких строк настройки, но в качестве бонуса он повторно использует потоки и применяет другие оптимизации для использования меньшего количества ресурсов. Как следует из названия, его также можно использовать для операций очереди. Вы можете указать максимальное количество параллельных операций и различные ограничения.