Iphone 无限循环用户界面

Iphone 无限循环用户界面,iphone,ios,ipad,Iphone,Ios,Ipad,我想知道我是否可以有一个iOS程序,在UI仍然工作的情况下保持循环 例如: while (1) { //do some calc here Application.ProcessMessages(); } 在这里,程序停留在一个循环中,并使用Application.ProcessMesages()来更新屏幕,并获得UI单击、滚动等 在IOS中,可能通过使用某种形式的RunLoop实现这样的功能吗 我试着使用这样的runLoop,它会运行一段时间,然后UI最终会冻结,这取决于Do

我想知道我是否可以有一个iOS程序,在UI仍然工作的情况下保持循环

例如:

while (1) {
    //do some calc here
    Application.ProcessMessages();
}
在这里,程序停留在一个循环中,并使用Application.ProcessMesages()来更新屏幕,并获得UI单击、滚动等

在IOS中,可能通过使用某种形式的RunLoop实现这样的功能吗

我试着使用这样的runLoop,它会运行一段时间,然后UI最终会冻结,这取决于DoSomeWork(…)在做什么,例如从internet下载一些东西

while(1) {
    DoSomeWork(....);
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES);
}
我知道还有其他的方法,但我想知道这样的方法在IOS中是否可行

或者你知道是什么导致了冰冻吗


感谢

UI在主线程上运行,如果您在主线程中有一个无限循环正在执行它将阻止的工作,您需要生成一个不同的线程来执行该工作,当您需要更新UI时,您应该在主线程上这样做,因为UIKit不是线程安全的。。。下面是一个如何实现这一点的示例,在我的示例中,线程被生成为选择器(如果您愿意,也可以创建NSThread的子类)

还有同样具有相同效果的
NSObject performSelectorOnMainThread
,请注意,如果从主线程调用调度主线程队列,它将阻塞并锁定


Hoope这有助于

用户界面“不工作”。您提供了一个视图,并设置了一个或多个处理程序,这些处理程序对按钮按下或其他操作起作用。您可以启动一个或多个其他线程,侦听来自网络、位置、电池电量不足等其他事件的消息。不需要像以前的CP/M那样进行轮询循环。

不,你不能停留在主UI线程上的无限循环中,而不让UI锁定或让操作系统杀死你的应用程序。您要么在另一个线程上运行处理循环,要么将处理过程分成只需几分之一秒的块,并使用队列或计时器安排这些短操作


后台处理线程可以发送PerformSelectorMainThread以请求屏幕更新。

如果主循环调用RunLoop函数,为什么主循环会阻塞?RunLoop函数不会处理主循环上的任何事件,即使它也在主循环上,通过调用RunLoop,再次递归调用主循环?这不会创建另一个线程来处理主线程上的任何事件吗?您在主运行循环上安排的事情是正确的吗?因此,根据他们正在做的事情(即下载需要更长时间才能完成的同步),他们将阻止主(UI)线程,你为什么还要尝试这样做?调用UI运行循环的唯一正确方法是从循环例程返回。在找到解决方案之前,你应该先问问这是否真的有必要。在现代编程中很少需要持久轮询。
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

    });
}