Как я могу приостановить / перезапустить цикл в target-c - PullRequest
0 голосов
/ 22 августа 2010

Хотелось бы выполнить некоторый код в цикле, но я хочу приостановить его, пока прокручивается просмотр uiscrollview.

Я создал BOOL с именем isScrolling, для которого в методе scrollViewDidScroll установлено значение "YES", а в методе scrollViewDidEndDecelerating установлено значение "NO".

Я хотел бы поместитьВыполните цикл в методе scrollViewDidEndDecelerating, но остановите его, когда isScrolling == YES, а затем перезапустите его, когда isScrolling == NO.

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

Например, вот простой цикл, который постоянно увеличивается с шагомиз 1, который я поместил в метод viewDidAppear:

for (int i = 1; i > 0; i++) {

    NSLog(@"i = %d", i);

    if (isScrolling == YES) {
        NSLog(@"break");
        break;
    }
}           

Но вся прокрутка отключена, пока этот цикл по какой-то причине работает, поэтому я не могу отменить его.

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

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

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

0 голосов
/ 22 августа 2010

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

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

– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewDidEndScrollingAnimation:

...

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

...