время сна в течение цикла - PullRequest
       17

время сна в течение цикла

1 голос
/ 27 августа 2009

Мне нужно сделать цикл for и между каждым циклом ждать 2 секунды и продолжать

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

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

Ответы [ 3 ]

8 голосов
/ 27 августа 2009
[NSThread sleepForTimeInterval:2.0];
2 голосов
/ 28 августа 2009

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

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

1 голос
/ 27 августа 2009

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

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

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

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