无限循环UI

时间:2011-12-16 18:12:30

标签: iphone ios ipad

我想知道我是否可以让一个iOS程序保持循环,而UI仍然有效。

例如:

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

此处程序保持循环,并使用Application.ProcessMesages()来更新屏幕,获取UI点击,滚动等。

在IOS中是否可以使用某种形式的RunLoop?

我尝试使用像这样的runLoop,它可以运行一段时间,然后UI最终会冻结,具体取决于DoSomeWork(...)正在做什么,例如从互联网上下载内容。

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

我知道还有其他方法可以做,但我想知道这样的事情是否适用于IOS?

或者你知道什么可能导致冻结吗?

由于

3 个答案:

答案 0 :(得分:1)

UI在主线程上运行,如果你有一个无限循环在主线程中工作它会阻塞,你需要产生一个不同的线程才能完成工作,当你需要更新UI时你应该在主线程上执行此操作,因为UIKit不是线程安全的...这是如何实现这一点的一个示例,在我的示例中,线程正在生成到选择器(如果您愿意,也可以创建NSThread的子类)< / p>

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这有帮助

答案 1 :(得分:0)

用户界面“不起作用”。您提供一个视图,并设置一个或多个处理程序,这些处理程序设置为按下按钮或其他内容。您可以启动一个或多个其他线程来侦听其他事件,例如来自网络,位置,电池电量低的消息,您可以命名它。不应该像CP / M的旧时代那样进行轮询循环。

答案 2 :(得分:0)

不,你不能在主UI线程上停留在无限循环中,并且没有UI锁定或让操作系统终止你的应用程序。您必须在另一个线程上运行处理循环,或者将处理分解为只需要几分之一秒的块,并使用队列或计时器安排这些短操作。

您的后台处理线程可以发送performSelecterOnMainThread来请求更新屏幕。