2009-08-27 5 views
1

мне нужно сделать для цикла и между каждой петлей подождите 2 секунды и продолжитьвремя сна в течение цикла

for (int i = 0; i < [stories count]; i++) { 
    //my code 
    //sleep 2 seconds and continue 
} 

Как я могу это сделать?

ответ

1

Проблема с этим состоит в том, что он будет блокировать пользовательский интерфейс для 2 * [stories count] секунд-конечно, достаточно долго для пользователя, чтобы заметить, что ваше приложение не отвечает, и, кажется, зависла. Плохо.

Используйте таймер вместо этого и сохраните индекс (если вам действительно нужен индекс) или NSEnumerator ([stores objectEnumerator]) в таймере userInfo. Внедрите свой метод обратного вызова по таймеру для работы только с одним объектом. Если вы используете индексы, этот метод также должен заменить индекс в userInfo следующим. Его последний шаг будет состоять в том, чтобы проверить, закончились ли вы элементы, и если да, вызовите метод, в котором вы аннулируете и освобождаете таймер (который вы также должны вызывать от dealloc).

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

2

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 требует нескольких строк настройки, но в качестве бонуса он повторно использует потоки и применяет другие оптимизации для использования меньшего количества ресурсов. Как следует из названия, его также можно использовать для операций очереди. Вы можете указать максимальное количество параллельных операций и различные ограничения.

Смежные вопросы