2011-12-16 5 views
0

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

Например:

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

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

ли что-нибудь как это возможно в IOS, возможно, используя какую-то форму RunLoop?

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

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

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

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

Благодаря

+0

Прежде чем найти решения, сначала спросите, действительно ли это необходимо. Постоянный опрос редко необходим в современном программировании. –

ответ

1

Пользовательский интерфейс работает на главном потоке, если вы ahve бесконечный цикл делает работу в основном потоке будет блокировать, вы должны породить другой поток, чтобы сделать работу, когда вам нужно для обновления пользовательского интерфейса вы должны сделать это в основном потоке, так как 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, что также будет иметь тот же эффект, обратите внимание, что если вы звоните ди spatch main thread queue из основного потока, который он будет блокировать и блокировать.

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

+0

Почему основной цикл цикла, если он вызывает функцию RunLoop, не будет ли функция runLoop обрабатывать какие-либо события в основном цикле, даже если он также находится в основном цикле, апически рекурсивный вызов основного цикла снова, вызывая RunLoop? не будет ли это создавать другой поток для обработки любых событий в основном потоке? –

+0

Вы правильно планируете вещи в главном цикле запуска? поэтому, в зависимости от того, что они делают (например, для загрузки какой-то синхронизации, которая занимает больше времени), они блокируют основной (UI) поток, почему вы пытаетесь сделать что-то подобное в любом случае? – Daniel

+0

Единственный правильный способ вызова цикла запуска пользовательского интерфейса - вернуться из вашей процедуры циклирования. – hotpaw2

0

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

0

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

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