我想知道我是否可以让一个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?
或者你知道什么可能导致冻结吗?
由于
答案 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来请求更新屏幕。