интерфейс с бесконечным циклом - PullRequest
0 голосов
/ 16 декабря 2011

Мне интересно, могу ли я иметь программу для iOS, которая остается в цикле, пока пользовательский интерфейс все еще работает.

Например:

while (1) {
    //do some calc here
    Application.ProcessMessages();
}

Здесь программа находится в цикле и использует Application.ProcessMesages () для обновления экрана и получения кликов пользовательского интерфейса, прокрутки и т. Д.

Возможно ли что-нибудь подобное в IOS, возможно, с использованием какой-либо формы RunLoop?

Я попытался использовать такой runLoop, он работает какое-то время, затем пользовательский интерфейс со временем зависает, в зависимости от того, что делает DoSomeWork (...), например, загружая что-то из Интернета.

while(1) {
    DoSomeWork(....);
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES);
}

Я знаю, что есть другие способы ведения дел, но мне было интересно, может ли что-то подобное работать в IOS?

Или Вы знаете, что может вызвать замораживание?

Спасибо

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Пользовательский интерфейс запускается в основном потоке, если вы выполняете работу в главном потоке, который он блокирует, то вам нужно порождать другой поток для выполнения работы, когда вам нужно обновить пользовательский интерфейс, вам следуетсделать это в основном потоке, так как UIKit не является потокобезопасным ... вот один пример того, как этого добиться, в моем примере поток порождается в селектор (вы можете также создать подклассы NSThread, если хотите)

NSThread *sendThread=[[NSThread alloc] initWithTarget:self selector:@selector(aSelector) object:nil];
[sendThread start];

-(void)aSelector
{
    //do some work
    //if you want to update the UI you should do so like so on the main thread
    dispatch_async( dispatch_get_main_queue(), ^{
        //do stuff on main thread

    });
}

Существует также NSObject performSelectorOnMainThread, который также будет иметь тот же эффект, обратите внимание, что если вы вызовите очередь основного потока отправки из основного потока, она заблокирует и заблокирует.

Hoopeэто помогает

0 голосов
/ 17 декабря 2011

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

Ваш поток фоновой обработки может отправлять executeSelecterOnMainThread для запроса обновлений на экране.

0 голосов
/ 17 декабря 2011

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

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